标题可能看起来不是特别清楚,但代码本身就解释了:
int shared_variable;
int get_shared_variable() {
int result;
pthread_mutex_lock(&shared_variable_mutex);
result = shared_variable;
pthread_mutex_unlock(&shared_variable_mutex);
return result;
}
void* thread_routine(void *arg) {
while (get_shared_variable() < 5000) {
printf();
printf();
sleep(2);
int i = 0;
while (pthread_mutex_trylock(&foo_mutexes[i]) != 0) {
i++;
pthread_mutex_lock(&foo_count_mutex);
if (i == foo_count) {
pthread_mutex_unlock(&foo_count_mutex);
sleep(1); // wait one second and retry
i = 0;
}
pthread_mutex_unlock(&foo_count_mutex);
}
pthread_mutex_lock(&shared_variable_mutex);
shared_variable += 10;
pthread_mutex_unlock(&shared_variable_mutex);
}
return NULL;
}
我正在将 thread_routine
传递给 pthread_create
(非常标准),但我在结果同步方面遇到问题。基本上,问题是第一个线程检查 while 条件,它通过,然后另一个线程检查它,它也通过。但是,当第一个线程完成且 shared_variable
达到 5000 时,第二个线程尚未完成,它又加了 10,最终结果变为 5010(或 NUM_OF_THREADS
- 1) * 10(如果我运行超过两个)最后,而整个过程应该在 5000 处结束。
另一个问题是,在 //do some work
中,我在屏幕上输出了一些内容,因此循环内的整个内容应该几乎像数据库中的事务一样工作条款。我似乎不知道如何解决这个问题,但我想我缺少一些简单的东西。提前致谢。
最佳答案
这个答案可能是也可能不是您想要的。因为正如评论中所解释的,您对程序预期行为的描述不完整。如果没有确切的预期行为,就很难给出完整的答案。但既然你问了,这里是基于所示代码的程序的可能结构。它说明的主要原则是 shared_variable
的关键部分需要既最小又完整。
int shared_variable;
void* thread_routine(void *arg)
{
while (1) {
pthread_mutex_lock(&shared_variable_mutex);
if (shared_variable >= 5000) {
pthread_mutex_unlock(&shared_variable_mutex);
break;
}
shared_variable += 10;
pthread_mutex_unlock(&shared_variable_mutex);
/* Other code that doesn't use shared_variable goes here */
}
return NULL;
}
关于c - 将线程的结果与递增的共享变量和条件同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36509926/