线程间同步机制01

xiaoxiao2021-02-28  73

一.定义:

信号量是一个特殊类型的变量,它可以被增加或者减少,但对其的关键访问被保证是原子操作,即使在一个多线程程序中也是如此。 我们将介绍一种最简单的信号量——二进制信号量,它只有0和1两种值。还有一种更通用的信号量——计数信号量,他可以有更大的取值范围。

二.信号量使用机制:

1.sem_init函数:

(1)功能:这个函数初始化由sem指向的信号量对象,设置它的共享选项,并给它一个初始的整数值。 (2)原型:

int sem_init(sem_t *sem, int pshared, unsigned int value);

2.sem_wait函数:

(1)功能: 以原子操作的方式将信号量的值减1。 (2)原型:

int sem_wait(sem_t *sem);

3.sem_post函数:

(1)功能: 以原子操作的方式将信号量的值加1。 (2)原型:

int sem_post(sem_t *sem);

4.sem_destroy函数:

(1)功能: 用完信号量之后对它进行清理。 (2)原型:

int sem_destroy(sem_t *sem);

三.例子:

#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <pthread.h> #include <semaphore.h> void *thread_function(void *arg); sem_t bin_sem; #define WORK_SIZE 1024 char work_area[WORK_SIZE]; int main() { int res; pthread_t a_thread; void *thread_result; res = sem_init(&bin_sem, 0, 0); if (res != 0) { perror("Semophore initialization failed."); exit(EXIT_FAILURE); } res = pthread_create(&a_thread, NULL, thread_function, NULL); if (res != 0) { perror("Thread create failed."); exit(EXIT_FAILURE); } printf("Input some text. Enter 'end' to finish.\n"); while (strncmp("end", work_area, 3) != 0) { fgets(work_area, WORK_SIZE, stdin); sem_post(&bin_sem); } printf("\nWaiting for thread to finish...\n"); res = pthread_join(a_thread, &thread_result); if (res != 0) { perror("Thread join failed.\n"); exit(EXIT_FAILURE); } printf("Thread joind\n"); sem_destroy(&bin_sem); exit(EXIT_SUCCESS); return 0; } void *thread_function(void *arg) { sem_wait(&bin_sem); while (strncmp("end", work_area, 3) != 0) { printf("You input %d characters\n", (int)strlen(work_area) - 1); sem_wait(&bin_sem); } pthread_exit(NULL); }
转载请注明原文地址: https://www.6miu.com/read-2080343.html

最新回复(0)