我有一个C应用程序,其中的一部分执行一些线程化的工作,但实现起来有些困难。我正在使用pthread.h(POSIX thread programming)作为准则。

我需要同步两个重复执行特定任务的线程预定次数,并且每次重复执行时,两个任务需要同时启动。我的想法是让每个线程在同步任务开始之前初始化并完成其工作,并且当这种情况发生时,线程1(我们称此线程TX)将向线程2(RX)发出信号,表明它可以开始执行任务。

这是一个例子:

static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t tx_condvar = PTHREAD_COND_INITIALIZER;
static bool tx_ready = false;


这些在头文件中声明。 TX线程如下所示:

while (reps > 0 && !task->quit) {

    pthread_mutex_lock(&mutex);
    tx_ready = true;
    pthread_cond_signal(&tx_condvar);
    pthread_mutex_unlock(&mutex);


    status = do_stuff();
    if (status != 0) {
        print_error();
        goto tx_task_out;
    }
    reps--;

    // one task done, wait till it's time to do the next
    usleep(delay_value_us);
    tx_ready = false;
}


然后是RX

while (!done && !task->quit) {
    // wait for the tx_ready signal before carrying on
    pthread_mutex_lock(&mutex);
    while (!tx_ready){
        pthread_cond_wait(&tx_condvar, &mutex);
    }
    pthread_mutex_unlock(&mutex);

    status = do stuff();

    if (status != 0) {
        print_error();
        goto rx_task_out;
    }

    n = fwrite(samples, 2 * sizeof(samples[0]), to_rx, p->out_file);
    num_rx += to_rx;
    if (num_rx == s->rx_length){
        done = true;
    }
}


有没有更好的方法来解决这个问题,我什至正确地做到了吗?对于每次重复,tx / rx线程中的两个任务必须同时开始,这一点非常重要。

预先感谢您的输入!

最佳答案

您正在寻找的被称为barrier。基本上,它阻止线程进入屏障,直到进入一定数量的线程,然后释放所有线程。

我相信pthread会有障碍,尽管它可能是扩展。

https://computing.llnl.gov/tutorials/pthreads/man/pthread_barrier_wait.txt

关于c - 在C中将线程与条件变量同步,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26257877/

10-11 23:08
查看更多