信号量重置为0

时间:2018-06-26 12:39:25

标签: linux multithreading semaphore

我正在Linux上运行以下代码。 我正在创建2个线程。我有2个信号量s1和s2。我期望线程2(fun2)运行一次并打印“ 789”,然后在S2上等待,因为S2初始化为值1。但是我看到的是,fun2在开始时本身就在S2上等待,甚至没有执行一次。如果将其初始化为1,在挂起之前不应执行一次。 我已经打印了S2的值。在初始状态下,S2的值为1。但是在fun2内部,其值为0。为什么会这样? 该程序的输出被打印几次“ 123”。永远不会打印“ 789”。

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

void* fun(void *);
void* fun2(void *);

sem_t s1,s2;

main()
{
  pthread_t tid;
  int value;
  pthread_attr_t attr;
  pthread_attr_init(&attr);

  pthread_t tid2;
  pthread_attr_t attr2;
  pthread_attr_init(&attr2);

  sem_t s1;

  if(0== sem_init(&s1,0,1))
  {
  printf("\nS1 created succesfully");
  }

  sem_t s2;
  if(0 == sem_init(&s2,0,1))
  {
    printf("\nS2 created succesfully");
  }

sem_getvalue(&s2, &value); 
 printf("\n At creation; Value of S2=%d", value);

sem_getvalue(&s1, &value); 
 printf("\n At creation; Value of S1=%d", value);

  pthread_create(&tid, &attr, fun, NULL);
  pthread_create(&tid2, &attr2, fun2, NULL);

  pthread_join(tid, NULL);
  pthread_join(tid2, NULL);


}

void* fun(void * arg)
{
int value;
  static int count=0;

sem_getvalue(&s1, &value); 
 printf("\n Value of S1=%d", value);

  while(1)
{

  //sem_wait(&s1);
  printf("\n123");
  count++;
  if (count>=5)
  {
    pthread_exit(0);
  }
  //sem_post(&s2);
  sleep(1);
}
}

void* fun2(void *arg)
{
  static int count=0;
  int value;
  sem_getvalue(&s2, &value); 
  printf("\n Value of S2=%d", value);
while(1)
{
  sem_wait(&s2); 
  printf("\n789");
  count++;
  if (count>=5)
  {
    pthread_exit(0);
  }
  //sem_post(&s1);

  sleep(1);
}
}

如果我从fun发布s2(现在在代码中注释),它会显示“ 789”。

0 个答案:

没有答案