gpt4 book ai didi

c - 在 C 中使用线程时的奇怪行为

转载 作者:太空宇宙 更新时间:2023-11-04 06:24:17 24 4
gpt4 key购买 nike

我对线程还很陌生,很难理解下面代码的行为。假设我使用命令行输入 10,我希望输出为 20,因为有两个线程分别将 count 的值递增 10 次。但是每次运行这个程序时输出都不是 20。以下是我的一些尝试:

命令行输入:10,预期输出:20,实际输出:15

命令行输入:10,预期输出:20,实际输出:10

命令行输入:10,预期输出:20,实际输出:13

命令行输入:10,异常输出:20,实际输出:20

#include <stdio.h>
#include <pthread.h>

/* The threads will increment this count
* n times (command line input).
*/
int count = 0;

/* The function the threads will perform */
void *increment(void *params);


int main(int argc, char *argv[]) {

/* Take in command line input for number of iterations */
long iterations = (long)atoi(argv[1]);

pthread_t thread_1, thread_2;

/* Create two threads. */
pthread_create(&thread_1, NULL, increment, (void*)iterations);
pthread_create(&thread_2, NULL, increment, (void*)iterations);

/* Wait for both to finish */
pthread_join(thread_1, NULL);
pthread_join(thread_2, NULL);

/* Print the final result for count. */
printf("Count = %d.\n", count);
pthread_exit(NULL);

}

void *increment(void *params) {
long iterations = (long)params;
int i;
/* Increment global count */
for(i = 0; i < iterations; i++) {
count++;
}
pthread_exit(NULL);
}

最佳答案

你的增量不是原子的,你没有插入任何同步机制,所以你的一个线程当然会覆盖 count 而另一个仍在增加它,导致增量“丢失” .

您需要一个原子增量函数(在 Windows 上,您有 InterlockedIncrement 为此),或一个显式锁定机制(如互斥锁)。

关于c - 在 C 中使用线程时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29208374/

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