gpt4 book ai didi

c - 为什么在使用线程时我的程序输出总是不同?

转载 作者:行者123 更新时间:2023-12-03 12:54:45 25 4
gpt4 key购买 nike

我的程序所需的功能:
使用命令行用户输入 N M N 是将要创建的新线程数, M 是每个线程将全局变量 A 递增多少。

这是我的代码:

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

static int A = 0;

void *Thread(void* x){
int i;
int n = *((int*)x);
for (i = 0; i<n; i++){
A++;
}
}

int main(int argc, char* argv[]){
int i;
int N = atoi(argv[1]);
int M = atoi(argv[2]);

pthread_t *thread = (pthread_t *) malloc(sizeof(pthread_t)*N);

if(!thread){
printf("No memory\n");
exit(2);
}

for (i = 0; i< N; i++){
if (pthread_create(&thread[i], NULL, Thread, &M)){
printf("Not able to create a thread\n");
exit(1);
}
}

for(i = 0; i< N; i++)
pthread_join(thread[i], NULL);

printf("A = %d\n", A);

return 0;
}

问题在于,每次我运行它时,都会有不同的输出。
Screenshot of my terminal when i run the program multiple times in a row

最佳答案

问题在于您正在创建多个并行尝试修改静态A全局变量的线程,而没有任何保护。

这意味着根据线程的调度,全局变量上的更改将不是原子的,从而产生这种效果。

您可以使用互斥锁解决此问题,并使用以下方法声明:

pthread_mutex_t mutex;

然后使用pthread_mutex_init和pthread_mutex_destroy初始化/释放它。

在线程内部,在进行更改之前,请先使用pthread_mutex_lock保护要更改的资源,然后使用pthread_mutex_unlock释放该资源。因此,代码将像这样更改:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>

static int A = 0;
pthread_mutex_t mutex;


void *Thread(void* x){
int i;
int n = *((int*)x);

pthread_mutex_lock(&mutex);
A += n;
pthread_mutex_unlock(&mutex);
}

int main(int argc, char* argv[]){
int i;
int N = atoi(argv[1]);
int M = atoi(argv[2]);

pthread_mutex_init(&mutex, NULL);
pthread_t *thread = (pthread_t *) malloc(sizeof(pthread_t)*N);

if(!thread){
printf("No memory\n");
exit(2);
}

for (i = 0; i< N; i++){
if (pthread_create(&thread[i], NULL, Thread, &M)){
printf("Not able to create a thread\n");
exit(1);
}
}

for(i = 0; i< N; i++)
pthread_join(thread[i], NULL);

printf("A = %d\n", A);

pthread_mutex_destroy(&mutex);

return 0;
}

关于c - 为什么在使用线程时我的程序输出总是不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40564788/

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