网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
07月24日漏签0天
c++吧 关注:625,638贴子:2,112,513
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 4回复贴,共1页
<<返回c++吧
>0< 加载中...

跟刘峰六学C语言(3) 信号量

  • 只看楼主
  • 收藏

  • 回复
  • sohu2000000
  • ||
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
在pthreads标准库里面, 库本身并不提供对信号量的支持,因为POSIX标准并没有对信号量做出定义,但是如果你一定要使用信号量来完成程序的话,那么所有的内容都会包含在semphore.h文件里
请注意:不要混合着使用系统V自带的信号量,系统V的信号量位于sys/sem.h文件中
view plaincopy to clipboardprint?
#include <semaphore.h>  
#include <pthread.h>  
#include <stdio.h>  
#define THREADS 20  
sem_t    OKToBuyMilk;  
int      milkAvailable;  
void* buyer(void *arg)  
{  
     //P()  
     sem_wait(&OKToBuyMilk);  
     if(!milkAvailable)  
     {  
         //Buy Some Milk  
         ++milkAvailable;  
     }  
     //V()  
     sem_post(&OKToBuyMilk);  
     return;  
}  
int main(int argc, char* argv[])  
{  
     int i;  
     pthread_t threads[THREADS];  
     milkAvailable=0;  
     //initlization the semphore with a value of 1.  
     //Note the second argument: passing zero denotes   
     //that the semaphore is shared between threads (and   
     //not processes)  
     if(sem_init(&OKToBuyMilk,0,1))  
     {  
         printf("Could not initialization a semphore\n");  
         return -1;  
     }  
     for(i=0;i<THREADS; ++i)  
     {  
         if(pthread_create(&threads[i],NULL,&buyer,NULL))  
         {  
             printf("Could not create thread %d\n",i);  
             return -1;  
         }  
     }  
     for(i=0;i<THREADS; ++i)  
     {  
         if(pthread_join(threads[i],NULL))  
         {  
             printf("Could not join thread %d\n",i);  
             return -1;  
         }  
     }  
     sem_destroy(&OKToBuyMilk);  
     //Make sure we don't have too much milk,      
     printf("Total milk: %d\n", milkAvailable);  
     return 0;  
}  
运行程序
关于Semphore的API有下面几点说明:
sem_init: 初始化一个新的semphore变量,第二个参数指出信号量的共享方式,0意味着该信号量是在线程间共享的而不是在进程间共享,最后的一个参数说明了信号量初始化时候的初始值
sem_destroy: 析构掉一个已经退出的semphore变量
sem_wait: 相当于P()操作  
sem_post: 相当于V()操作下面让我们用表格的形式总结一下关于线程操作的一些方法
    基本操作   绝缘量   互斥量   信号量  
生成   pthread_create   pthread_barrier_init   pthread_mutex_init   sem_init  
析构   pthread_exit   pthread_barrier_destroy   pthread_mutex_destroy   sem_destroy  
挂起等待   pthread_join   pthread_barrier_wait   ---   ---  
获得资源   ---   ---   pthread_mutex_lock   sem_wait  
释放   ---   ---   pthread_mutex_unlock   sem_post  
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/asiainfolf/archive/2010/10/02/5***625.aspx



  • 杰物
  • <
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
posix不算C标准……而且叫做信号更好一些吧
对Windows编程者基本没用


2025-07-24 12:22:29
广告
不感兴趣
开通SVIP免广告
  • sohu2000000
  • ||
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
木有做过WINDOWS编程 -_-!! .....


  • sohu2000000
  • ||
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
木有做过WINDOWS编程 -_-!! .....


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 4回复贴,共1页
<<返回c++吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示