标题可能看起来不太清楚,但代码解释了自己:
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;
}