gpt4 book ai didi

c - 与 Posix 信号量同步线程

转载 作者:行者123 更新时间:2023-11-30 15:20:09 25 4
gpt4 key购买 nike

嗨,我正在尝试创建 3 个线程,多次打印不同的消息。然后同步它们,以便打印例如一二三一二三一二三...当我运行程序时,有时它不正确,我不确定我做错了什么。

  sem_t sema, semb, semc;


void *printone(void *arg)
{
printf("<ONE>");
sem_wait(&semc);
sem_post(&semb);
}

void *printtwo(void *arg)
{
printf("<TWO>");
sem_wait(&sema);
sem_post(&semc);
}

void *printthree(void *arg)
{
printf("<THREE>");
sem_wait(&semb);
sem_post(&sema);
}

main()

{
pthread_t th1,th2,th3;
int i;

sem_init(&sema,0,1);
sem_init(&semb,0,0);
sem_init(&semc,0,0);

for(i=0;i<10;i++){

pthread_create( &th1, NULL, printone, (void *) 1);
pthread_create( &th2, NULL, printtwo, (void *) 2);
pthread_create( &th3, NULL, printthree, (void *) 3);

pthread_join(th1, NULL);
pthread_join(th2, NULL);
pthread_join(th3, NULL);
}



pthread_exit(NULL);

}

最佳答案

您似乎有一种可行的方法:每个线程等待一个信号量,然后发布另一个信号量以让下一个线程运行。然而,为了实现这一点,每个线程都应该在执行其工作(即打印其消息)之前等待其信号量。

此外,您的线程函数似乎使用了错误的信号量。为了让 printone() 首先运行,它必须等待您用值 1 初始化的信号量。为了让 printtwo() 接下来运行,它必须等待任何一个信号量 printone() 发布到。同样,对于 printthird()

其次,如果您的线程函数不打算使用它们的参数,那么最好将 NULL 作为第三个参数传递给 pthread_create() .

关于c - 与 Posix 信号量同步线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30156079/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com