每次程序输出变化 运行 (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) 移出循环即可解决此问题;但您可能需要考虑一些其他方法来解决此类问题。
下面是代码,只有主要部分。
每次代码是 运行,输出都会改变,我认为这是因为 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) 移出循环即可解决此问题;但您可能需要考虑一些其他方法来解决此类问题。