我正在学习使用pthreads,互斥量和条件变量,但是事情没有按预期进行。
主线程:连续运行,向工作线程发出信号,从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);
}
}
我对上面代码的理解也是这样的:
辅助线程锁定互斥锁。 (在main的循环之前启动)
工作线程cond_wait解锁互斥锁并等待条件。
主线程锁定互斥锁。
主线程发出信号状态。
工作线程重新获得互斥锁,并写入文件。
辅助线程解锁互斥锁。
主线程重新获得互斥锁并将其锁定。
主线程读取文件。
主线程解锁互斥锁。
辅助线程重新获得锁定?
该行为实际上是:
主线程从文件读取
辅助线程唤醒,写入文件,不再运行
最佳答案
首先,您需要在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)
关于c - pthread条件变量是否只能使用一次?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50070001/