信号量在多线程编程中用于协调对共享资源的访问,它使用整数变量表示可用资源数量,并提供 wait() 和 signal() 两个基本操作:wait():当没有可用的资源时阻塞线程,当资源可用时减少信号量的值并允许线程继续执行。signal():增加信号量的值,表示又有一个资源可用。

C 语言多线程编程中信号量的使用
简介
信号量是一种同步机制,用于在多线程环境中协调对共享资源的访问。它使用一个整数变量来表示可用的资源数量,并且提供了两个基本操作:wait() 和 signal()。
创建信号量
立即学习“C语言免费学习笔记(深入)”;
sem_t 数据类型用于表示信号量。它是一个指向信号量结构的指针。要创建信号量,可以使用 sem_init() 函数:
iWebShop是一款基于PHP语言及MYSQL数据库开发的B2B2C多用户开源免费的商城系统,系统支持自营和多商家入驻、集成微信商城、手机商城、移动端APP商城、三级分销、视频电商直播、微信小程序等于一体,它可以承载大数据量且性能优良,还可以跨平台,界面美观功能丰富是电商建站首选源码。iWebShop开源商城系统 v5.14 更新日志:新增商品编辑页面规格图片上传优化商品详情页面规格图片与主图切
sem_t my_semaphore; sem_init(&my_semaphore, 0, 1);
第一个参数是信号量的指针,第二个参数是信号量的初始值(表示可用的资源数量),第三个参数是操作系统指定的标志。
信号量的操作
-
sem_wait():当没有可用的资源时,该函数将阻塞线程。当资源可用时,它将减少信号量的值,并允许线程继续执行。 -
sem_post():该函数增加信号量的值,表示又有一个资源可用了。
实战案例
以下是一个使用信号量的线程安全计数器的示例:
#include#include // 线程安全计数器 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("计数器:%d\n", counter); return 0; }
注意:在使用完信号量后,必须使用 sem_destroy() 函数销毁它。









