C程序使用无限循环的线程和信号量打印句子



我目前正在尝试制作一个程序,该程序将使用三个线程打印"多么美妙的世界"。第一个线程应该永远打印"What A",第二个线程"精彩",第三个线程"世界"。所有这些都应该与sempahores同步。我尝试这样做,但是在不定式循环运行 3-4 次后,句子发生变化并变成"美妙的世界"等。 有什么帮助吗?谢谢你的时间!

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <semaphore.h>
#include <string.h>
sem_t mutex;

void *thread_function(void *arg) 
{
char *k=arg;
sem_wait(&mutex);
while(1){
printf("%s ", k);
fflush(stdout);  
sleep(1);
sem_post(&mutex);
}
pthread_exit(NULL);
}
int main() 
{
sem_init(&mutex, 0, 1);
char k[3][11]={"What A", "Wonderful" ,"World"};
pthread_t mythread1,mythread2,mythread3;
pthread_create( &mythread1, NULL, thread_function, k[2]); 
pthread_create( &mythread2, NULL, thread_function, k[1]); 
pthread_create( &mythread3, NULL, thread_function, k[0]); 
pthread_join ( mythread3, NULL);
pthread_join ( mythread2, NULL);
pthread_join ( mythread1, NULL);
pthread_exit(NULL);
sem_destroy(&mutex);
return 0;
}

有几个问题。您无法使用一个信号量来实现此目的,因为您无法强制执行顺序。您需要 3 个信号量(理想情况下在数组中(并为每个线程传递索引(使其与要打印的单词相同(。使信号量数组和单词数组全局化以保持简单。

确保第一个信号量初始化为 1,其余信号量初始化为 0。

在线程中,等待信号量(基于传递的索引(,打印单词,然后发布到下一个信号量(mutex[(index+1) % 3](

最新更新