我有一个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线程中的两个任务在每次重复时同时开始。
提前感谢您的意见!
答案 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编译器(针对底层)处理时间关键循环的通用技术。