我正在学习使用信号量,下面是我尝试实现的一个小场景。它在某种程度上表现得很奇怪。在 sem_wait() 第一次被解除阻塞后,它不再被阻塞并继续循环,不知道为什么。这是使用信号量的正确方法还是正确的场景?
编辑:我刚刚意识到,如果我在 sem_post 之后取消注释睡眠,它工作正常。.原因是在线程可以执行 coin=0 之前反复执行 sem_post() 我相信。但是以这种方式与信号量一起使用睡眠是否正确。我相信这会被认为是一种不好的做法?
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#include <semaphore.h>
#define MAX_MSG_LEN 256
sem_t sem1;
sem_t sem2;
int coin=0;
void *thrdFun1(void *arg);
void *thrdFun2(void *arg);
void toggleCase(char *buf, int cnt);
int main()
{
pthread_t thrd1;
char argmsg1[] = "Thread1: Waiting to deliver\n";
int thNum;
int res;
res = sem_init(&sem1, 0,0);
// res = sem_init(&sem2, 0,0);
res = pthread_create(&thrd1, NULL, thrdFun1, argmsg1);
while(1)
{
if (coin==0)
{
printf("no coin: please enter coin\n");
scanf("%d",&coin);
}
else
{
sem_post(&sem1);
// sleep(1);
}
}
return 0;
}
void *thrdFun1(void *arg)
{
while(1)
{
printf("I'm %s\n",(char *)arg);
sem_wait(&sem1);
printf("Delivered...\n");
coin=0;
sleep(1);
}
}