信号量在多线程编程中用于协调对共享资源的访问,它使用整数变量表示可用资源数量,并提供 wait() 和 signal() 两个基本操作:wait():当没有可用的资源时阻塞线程,当资源可用时减少信号量的值并允许线程继续执行。signal():增加信号量的值,表示又有一个资源可用。
C 语言多线程编程中信号量的使用
简介
信号量是一种,用于在多线程环境中协调对共享资源的访问。它使用一个整数变量来表示可用的资源数量,并且提供了两个基本操作:wait() 和 signal()。
创建信号量
立即学习“”;
sem_t 数据类型用于表示信号量。它是一个指向信号量结构的指针。要创建信号量,可以使用 sem_init() 函数:
sem_t my_semaphore; sem_init(&my_semaphore, 0, 1);
登录后复制
第一个参数是信号量的指针,第二个参数是信号量的初始值(表示可用的资源数量),第三个参数是指定的标志。
信号量的操作
- sem_wait():当没有可用的资源时,该函数将阻塞线程。当资源可用时,它将减少信号量的值,并允许线程继续执行。
- sem_post():该函数增加信号量的值,表示又有一个资源可用了。
实战案例
以下是一个使用信号量的线程安全计数器的示例:
#include <pthread.h> #include <semaphore.h> // 线程安全计数器 int counter = 0; // 信号量用于保护计数器 sem_t counter_semaphore; void *increment_thread(void *args) { while (1) { // 等待信号量 sem_wait(&counter_semaphore); // 增量计数器 counter++; // 释放信号量 sem_post(&counter_semaphore); } return NULL; } int main() { // 初始化信号量 sem_init(&counter_semaphore, 0, 1); // 创建两个增量线程 pthread_t threads[2]; for (int i = 0; i < 2; i++) { pthread_create(&threads[i], NULL, increment_thread, NULL); } // 让主线程睡眠一段时间,允许子线程运行 sleep(1); // 打印计数器值 printf("计数器:%dn", counter); return 0; }
登录后复制
注意:在使用完信号量后,必须使用 sem_destroy() 函数销毁它。
以上就是C语言多线程编程中信号量的使用的详细内容,更多请关注php中文网其它相关文章!