我正在学习使用pthreads,互斥量和条件变量,但事情并没有按预期进行。
MAIN THREAD:连续运行,发出工作线程信号,从file_A读取。
WORKER THREAD:睡眠,直到收到信号,写入file_A,重新进入睡眠状态(应该是可重复的)
所以我理解这里需要一个互斥锁来阻止两个线程读取/写入同一个文件。我使用条件变量来通知工作线程。
但由于某种原因,工作线程只运行一次。我是否需要重置条件变量或执行其他操作?
工作线程函数:
void* WriteTime(){
pthread_mutex_lock(&mutex);
pthread_cond_wait(&condition, &mutex);
/* Open File, Write to File, Close File */
pthread_mutex_unlock(&mutex);
}
主线程:
pthread_t timeThread;
pthread_create(&timeThread, NULL, &WriteTime, NULL);
while(gameConditionFulfilled == false){
/* Print status, gets user input into line */
/* If user enters "time", wake up WORKER_THREAD */
if(strcmp(line, "time")==0){
pthread_mutex_lock(&mutex);
pthread_cond_signal(&condition);
/* Read from file, print data, close file */
pthread_mutex_unlock(&mutex);
}
}
我对上述代码的理解也是这样的:
行为实际上是:
答案 0 :(得分:1)
首先,你需要在WriteTime()中使用某种循环 - 返回会导致调用pthread_exit()。当pthread_create()启动一个线程时,它就像是:
一样启动pthread_exit((*func)(arg));
这引出了第二点 - 你的编译器应该对此尖叫,因为你的WriteTime()没有返回任何东西。警告很有用;他们不需要服从,但你应该理解他们为什么被提出来。
要跳过几章,条件变量的概念是保护“条件”;例如,有数据准备读或写。您使用它们就像信号量一样,但与信号量不同,条件变量没有任何内存。只有在线程等待时调用pthread_condition_(signal | broadcast)()时,Pthread_condition_wait()才会返回。如果在没有人等待时调用pthread_condition_signal(),则不会发生任何事情。所以条件变量的习惯用法是:
lock(mutex)
while (something_hasn’t_happened) {
wait(cond, mutex)
}
do something
unlock(mutex)