首页 / LINUX / Linux线程同步---信号量
Linux线程同步---信号量
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Linux线程同步---信号量,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1600字,纯文字阅读大概需要3分钟。
内容图文
首先讲一下线程同步信号量的几个关键步骤!
1、定义并初始化信号量。
(1) sem_t bin_sem;
(2) res = sem_init(&bin_sem,0,0);
详细步骤可以查看man帮助页面
2、使用信号量
(1) 信号量加1操作。sem_post(&bin_sem);
(2) 信号量等待并减1操作。sem_wait(&bin_sem);
初始化后一般处于等待状态,执行某个操作后加1,而另个一个操作执行前进行等待操作。如果有多个线程,通常是一个线程进行加1操作,另外一个行程处于等待状态。
关于信号量的死锁问题,这里暂不讨论。
3、使用完毕即时销毁。
sem_destroy(&bin_sem);
因为信号量也是一种资源。用完就释放。
下面是某个教程中的经典例子,干货如下。当然也可以查看man页面例子。
#include<stdio.h> #include<unistd.h> #include<stdlib.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("Semaphore initialization failed!\n"); exit(EXIT_FAILURE); } res = pthread_create(&a_thread,NULL,thread_function,NULL); if(res != 0){ perror("Thread creation failed"); exit(EXIT_FAILURE); } printf("Input some text. Enter ‘end‘to finihed"); while(strncmp("end",work_area,3) != 0){ fgets(work_area,WORK_SIZE,stdin); sem_post(&bin_sem); } printf("\nWainting for theread to finish...\n"); res = pthread_join(a_thread,&thread_result); if( res !=0){ perror("Thread join failed"); exit(EXIT_FAILURE); } printf("Thread joined\n"); sem_destroy(&bin_sem); exit(EXIT_FAILURE); } void *thread_function(void *arg){ sem_wait(&bin_sem); while(strncmp("end",work_area,3) != 0){ printf("You input %d characters\n",strlen(work_area)-1); sem_wait(&bin_sem); } pthread_exit(NULL); }
原文:http://www.cnblogs.com/farbeyond/p/4477257.html
内容总结
以上是互联网集市为您收集整理的Linux线程同步---信号量全部内容,希望文章能够帮你解决Linux线程同步---信号量所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。