多线程使用信号量sem_init,sem_wait,sem_post

摘要:
信号量的主要功能是:intsem_init;intsem_等待;intsem_后置;sem_ Init用于初始化指定的信号。pshared为0,表示信号在当前进程的多个线程之间共享。value表示初始化信号的值。例如,如果对值为2_Wait()的信号量调用sem,则线程将继续执行,信号量值将为-1。初始化值=0后,使用sem_Wai将阻塞此线程,此线程函数将等待其他线程函数调用sem_post将此值增加,使其不再为0,然后开始执行。然后值为-1。以下是例程:#include #includesem_ tsem;void*func1{sem_wait;int*running=arg;printf;printfvoid*func2{printf;sem_post;}intmain(){sem_init;pthread_thread[2];inta=5;pthread _ create;printf;sleep;pthreads _ create,printf;pthreread_join;pturead_join,sem_destory;}运行结果是:func1被阻塞,直到func2+1信号量,执行才开始。

信号量的主要函数有:

int sem_init(sem_t *sem,int pshared,unsigned int value);
int sem_wait(sem_t *sem);
int sem_post(sem_t *sem);

sem_init用于对指定信号初始化,pshared为0,表示信号在当前进程的多个线程之间共享,value表示初始化信号的值。 
sem_wait可以用来阻塞当前线程,直到信号量的值大于0,解除阻塞。解除阻塞后,sem的值-1,表示公共资源被执行减少了。例如:如果你对一个值为2的信号量调用sem_wait(),线程将会继续执行,信号量的值将-1。当初始化value=0后,使用sem_wai会阻塞这个线程,这个线程函数就会等待其它线程函数调用sem_post增加了了这个值使它不再是0,才开始执行,然后value值-1。 
sem_post用于增加信号量的值+1,当有线程阻塞在这个信号量上时,调用这个函数会使其中的一个线程不在阻塞,选择机制由线程的调度策略决定。 
下面是例程:

  #include <stdio.h>
  #include <semaphore.h>

  sem_t sem;
  void* func1(void)
  {
      sem_wait(&sem);
      int *running=arg;
      printf("thread running1
");
      printf("%d
",*running);
  }

  void* func2(void* arg)
  {
      printf("pthread2 running
");
      sem_post(&sem);
  }
  int main()
  {
      sem_init(&sem,0,0);
      pthread_t thread[2];
      int a=5;
      pthread_create(&(thread[0]),NULL,(void*)func,(void*)&a);
      printf("main thread running
");
      sleep(10);
      pthread_create(&(thread[1]),NULL,(void*)func2,(void*)&a);
      printf("main thread running2
");
      pthread_join(thread[0],NULL);
      pthread_join(thread[1],NULL);
      sem_destory(&sem);
  }

运行结果为: 
func1被阻塞,直到fun2把信号量+1,才开始执行。

main pthread running
main pthread running
pthread2 running
pthread1 running
5

免责声明:文章转载自《多线程使用信号量sem_init,sem_wait,sem_post》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇JDBC: C3P0连接池在vscode中的vue单文件组件的代码提示以及自动符合Eslint规范下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

记一个多线程使用libevent的问题

前段时间使用libevent网络库实现了一个游戏服务器引擎,在此记录下其中遇到的一个问题。 我在设计服务器上选择把逻辑和网络分线程,线程之间通信使用队列。但是这样做会有个问题: 当逻辑线程想要主动的发一个数据包的时候,网络线程此时可能还阻塞在等待网络IO的系统调用上(比如说epoll)。如果不做特殊处理的话,此时消息包就会一直积压在缓冲区中,直到下一次网络...

iOS开发网络篇—多线程断点下载

iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载。项目中使用了苹果自带的类,实现了同时开启多条线程下载一个较大的文件。因为实现过程较为复杂,所以下面贴出完整的代码。 实现思路:下载开始,创建一个和要下载的文件大小相同的文件(如果要下载的文件为100M,那么就在沙盒中创建一个100M的文件,然后计算每一段的下载量,开启多条线程下载各段的数据,...

一道有意思的多线程面试题 C# 代码实现

如果你对多线程的控制不怎么了解,那么理解了这篇文章的内容也许对你有帮助。鼓励先自己动手实现一遍,做不出来在看代码。 题目一:两个线程交替打印0~100的奇偶数 这道题就是说有两个线程,一个名为偶数线程,一个名为奇数线程,偶数线程只打印偶数,奇数线程只打印奇数,两个线程按顺序交替打印。本文重点不是说的这道题,这道题是下面那道题的简单版本,用来做个过渡。 效果...

笔试题多线程

1. 描述线程与进程的区别? 一个应用程序实例是一个进程,一个进程内包含一个或多个线程,线程是进程的一部分; 进程之间是相互独立的,他们有各自的私有内存空间和资源,进程内的线程可以共享其所属进程的所有资源; 2. 为什么GUI不支持跨线程访问控件?一般如何解决这个问题? 因为GUI应用程序引入了一个特殊的线程处理模型,为了保证UI控件的线程安全,这个线...

【转】 .NET中STAThread和MTAThread

ref:http://blog.csdn.net/dyllove98/article/details/9735955 1 COM中的公寓 本文讨论进程内COM组件。以一个示例直观演示STAThread和MTAThread的作用和区别。 1.1 基本规则 公寓是COM组件的运行环境,日常生活中公寓是用来住人的,COM中的公寓是用来住COM组件的对象的,每个...

多线程详细介绍

什么是进程线程:我们来看一下自己的任务管理器 这里的每一项都是一个进程,我们的发布的每一个应用程序都需要一个进程去运行,在一个进程内可以有多个线程去计算执行程序。我们看下面的图片: 我们可以看一下进程和线程的数量,很明显可以看出,线程和进程的关系。我们的每一个操作都需要一个线程来执行,鼠标的点击就需要线程去响应我们的操作。 现在我们不难理解,我们一个应...