我正在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”。