在C中使用条件变量同步线程

时间:2014-10-08 13:16:03

标签: c multithreading

我有一个C应用程序,其中一部分做了一些线程化的东西,我实现起来有些困难。我正在使用pthread.h(POSIX thread programming)作为指导。

我需要同步两个重复某个任务预定次数的线程,每次重复时,两个任务需要同时启动。我的想法是让每个线程在sync'd任务开始之前初始化并完成它们的工作,当发生这种情况时,线程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线程中的两个任务在每次重复时同时开始。

提前感谢您的意见!

2 个答案:

答案 0 :(得分:1)

您要找的是barrier。基本上它会阻止进入屏障的线程,直到进入一定数量的线程然后将它们全部释放。

我相信pthreads有一个障碍,虽然它可能是一个扩展。

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

答案 1 :(得分:0)

首先,如果您不使用多核处理器,则无法在同一时间运行两个任务。

在同一时间启动两个任务需要一个多核系统。 (SMP架构,其中具有共享内存的多个核在单个OS下)。在几个开发环境中可以使用扩展,专门用于利用 processor affinity 等功能,您可以将特定线程专用于仅在特定核心上运行,或设置专用于运行特定线程的处理器,以及何时运行它们。

我使用LabWindows / CVI(带有扩展的ANSI C)。 HERE 是一篇关于使用多核功能的小白皮书。 Here is another 主要是针对NI的,但也包括一些适用于使用任何ANSI C编译器(针对底层)处理时间关键循环的通用技术。