我正在学习使用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/

10-11 06:29
查看更多