c - Sem_wait() 在第一个 true 条件后不阻塞

标签 c synchronization semaphore

我正在学习使用信号量,下面是我尝试实现的一个小场景。它在某种程度上表现得很奇怪。在 sem_wait() 第一次被解除阻塞后,它不会再次被阻塞并继续循环,不明白为什么。这是使用信号量的正确方法或正确场景吗?

编辑:我刚刚意识到,如果我在 sem_post 之后取消对 sleep 的注释,它就可以正常工作。 .原因是它在线程可以做 coin=0 之前反复做 sem_post() 我相信。但是这样用信号量来使用 sleep 是正确的吗?我认为这会被视为一种不好的做法?

#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);
    }
}       

最佳答案

信号量用于控制临界区访问。在这种情况下,关键部分将是输出 shell。当调用 pthread_create() 时,线程可能会或可能不会立即启动。此外,sem_wait() 将在每次调用时减少 sem1 的值。因此,当您在 thrdFun1 函数中包含 sleep(1) 时,可能会出现未定义的行为:)

关于c - Sem_wait() 在第一个 true 条件后不阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17481707/

相关文章:

c - sem_post,信号处理程序和未定义的行为

c - 根据偏移量和长度设置数组中的 bin 字段

c - 管道流问题

java - 是什么使得从静态初始化程序初始化对象引用以安全地发布对象?

c++ - 如何克服 WaitForMultipleObjects 的 MAXIMUM_WAIT_OBJECTS 限制?

c++ - Linux进程间可重入信号量

python - C 中灯开关信号量的正确形式

c++ - 如何使用 ffmpeg 以便不需要将其 dll 包含在您的应用程序文件夹中?

c - 初始化了什么?

java - 无法实例化类型 Lock