Chinaunix首页 | 论坛 | 博客
  • 博客访问: 64715
  • 博文数量: 21
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 236
  • 用 户 组: 普通用户
  • 注册时间: 2014-09-05 21:34
文章分类

全部博文(21)

文章存档

2015年(21)

我的朋友

分类: LINUX

2015-08-04 15:50:20

线程中使用信号量好像和互斥差不多

点击(此处)折叠或打开

  1. //start from the very beginning,and to create greatness
  2. //@author: Chuangwei Lin
  3. //@E-mail:979951191@qq.com
  4. //@brief: 一个线程和信号量的例子

  5. #include <stdio.h>
  6. #include <pthread.h>//线程的头文件
  7. #include <semaphore.h>
  8. void *producter(void *arg);//生产者
  9. void *consumer(void *arg);//消费者
  10. sem_t i;//信号量
  11. int running = 1;//线程运行控制
  12. /******************************************************
  13. 函数名:main函数
  14. 参数:
  15. 功能:多线程,信号量
  16. *******************************************************/
  17. int main(int argc, char const *argv[])
  18. {
  19.     pthread_t producter_t;//生产者线程控制
  20.     pthread_t consumer_t;//消费者线程控制
  21.      sem_init(&i,0,100);//信号量初始化为100
  22.     pthread_create(&producter_t,NULL,(void*)producter,NULL);//建立生产者线程
  23.     pthread_create(&consumer_t,NULL,(void*)consumer,NULL);//建立消费者线程
  24.     usleep(1);//等待线程创建完毕
  25.     
  26.     running = 0;//设置线程退出值
  27.     pthread_join(producter_t,NULL);//等待生产者线程退出
  28.     pthread_join(consumer_t,NULL);//等待消费者线程退出
  29.     sem_destroy(&i);//销毁信号量

  30.     return 0;
  31. }
  32. /******************************************************
  33. 函数名:void *producter(void *arg)
  34. 参数:
  35. 功能:生产者函数,使信号量i增加
  36. *******************************************************/
  37. void *producter(void *arg)
  38. {
  39.     int semval = 0;//获取信号量的值
  40.     while(running)//没有设置退出时
  41.     {
  42.             usleep(1);
  43.             sem_post(&i);//信号量增加
  44.             sem_getvalue(&i,&semval);//得到信号量的值
  45.             printf("生产者:当前总数量:%d\n",semval);
  46.     }
  47. }
  48. /******************************************************
  49. 函数名:void *consumer(void *arg)
  50. 参数:
  51. 功能:消费者函数,使信号量i减少
  52. *******************************************************/
  53. void *consumer(void *arg)
  54. {
  55.     int semval = 0;
  56.     while(running)//没有设置退出时
  57.     {
  58.             usleep(1);
  59.             sem_wait(&i);//使信号量减少
  60.             sem_getvalue(&i,&semval);//得到信号量的值
  61.             printf("消费者:当前总数量:%d\n",semval);
  62.     }
  63. }
usleep和sleep的区别:
函数名: sleep
 头文件:    #include <unistd.h>  // 在gcc编译器中,使用的头文件因gcc版本的不同而不同
 功  能: 执行挂起指定的秒数
函数名: usleep
 头文件: #include <unistd.h>
 功  能: usleep功能把进程挂起一段时间, 单位是微秒(百万分之一秒);
 语  法: void usleep(int micro_seconds);
 返回值: 无
 内容说明:本函数可暂时使程序停止执行。参数 micro_seconds 为要暂停的微秒数(us)。
阅读(958) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~