每次程序输出变化 运行 (C pthread, semaphores)

Output changes each time the program is run (C pthread, semaphores)

下面是代码,只有主要部分。 每次代码是 运行,输出都会改变,我认为这是因为 thread 1 不是 运行,但我不知道如何修复它。

我的目标是 i 值在 thread 1 中增加 10 次,然后在 thread 2 中减少 10 次,但我不知道为什么这不会发生在每个 运行 通过。

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

int i = 0;
int temp = 0;
sem_t delayT;
sem_t sync;

void * thread1(void * p)
{
    sem_wait(&delayT);
    while(i>0)
    {
        sem_wait(&sync);
        i--;
        temp = i;
        printf("Out:%d\n",i);
        sem_post(&sync);
        if(temp==0)
            sem_wait(&delayT);
    }
}



void * thread2(void * p)
{
    while(i<10)
    {
        sem_wait(&sync);
        i++; 
        printf("in:%d\n",i);
        if(i==10)
            sem_post(&delayT);
        sem_post(&sync);
    }
}

int main (int argc, char * argv[]) {
    pthread_t t1;
    pthread_t t2;

    sem_init(&delayT,0,0);
    sem_init(&sync,0,1);

    pthread_create (&t1, NULL, thread1, NULL);
    pthread_create (&t2, NULL, thread2, NULL);

    pthread_join (t2, NULL);
}

我相信你错过了 pthread_join。 您等待生产者线程而不是消费者,然后程序在线程 1 到达倒计时结束之前停止。

添加

 pthread_join(t1, NULL);

最后

关于:对于i值在线程1中增加10次然后在线程2中减少10次,

未在线程 1 中添加 i 值。

线程 2 中的 i 值未递减。

所以,要么贴的代码有误,要么问题描述有误。

您有竞争条件。在线程 2 中:

if(i==10)
    sem_post(&delayT);
sem_post(&sync);

发布delayT后,T1有可能提前;然后在 T2 发布同步后,T1 可以进一步前进,以便在 T2 测试其 while 条件时,i 小于 10。您可以进一步分解它以查看有效的输出集,但我确信有很多。

只需将 sem_post(&delayT) 移出循环即可解决此问题;但您可能需要考虑一些其他方法来解决此类问题。