gpt4 book ai didi

c - 将线程的结果与递增的共享变量和条件同步

转载 作者:行者123 更新时间:2023-11-30 17:02:38 25 4
gpt4 key购买 nike

标题可能看起来不是特别清楚,但代码本身就解释了:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com