我有一个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/