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

标签 c multithreading concurrency

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

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/

相关文章:

c - 在 C 中更新多维数组

Python 运行 ffmpeg 并进行多处理

C++ 线程,共享数据

apache-spark - PySpark - 运行进程

c - 无法理解的VC++6编译错误C2664

c - 如何通过提取部分数组来填充数组

python - 多线程 Python 文件系统爬虫

java - 将对象分配给在同步块(synchronized block)外定义的字段 - 它是线程安全的吗?

concurrency - 为什么函数会提前返回?

c - 如何获得尽可能多的关于 OpenGL 上下文的信息