gpt4 book ai didi

c - 使用 pthread_mutex_lock 时遇到问题

转载 作者:太空狗 更新时间:2023-10-29 11:07:51 25 4
gpt4 key购买 nike

我刚开始在大学学习线程,但似乎不太了解它。

我想让我的代码获取参数并检查它们是偶数还是质数,如果是,则打印它们。另外对这些数字中的每一个求和。

这是代码:

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

#define something 10

pthread_mutex_t lock=PTHREAD_MUTEX_INITIALIZER;
int snrp=0;
int sprim=0;

void * verif(void* argv){
pthread_mutex_lock(&lock);
int x=*(int*)argv;
if (x%2==0){
printf("%d is even\n",x);
snrp+=x;
}
else{
int ok=1;
int d;
if(x<1)
ok=0;
for(d=3;d*d<x;d+=2)
if(x%d==0)
ok=0;
if(ok==0)
return NULL;
printf("%d is prime\n",x);
sprim+=x;
}
pthread_mutex_unlock(&lock);
sleep(1);
return NULL;
}


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

pthread_t threads[something];
int i,n;
for(i=1;i<argc;i+=1){
n=atoi(argv[i]);
if(pthread_create(&threads[i],NULL,verif,(void*) &n))
printf("Error");
}
for(i=1;i<argc;i+=1)
pthread_join(threads[i],NULL);

printf("Even numbers sum is %d \n",snrp);
printf("Prime numbers sum is %d \n",sprim);
pthread_mutex_destroy(&lock);
return 0;

}

例如,如果我使用参数 2,3,5,我会得到输出:

5 is prime
5 is prime
5 is prime
Even numbers sum is 0
Prime numbers sum is 15

谁能解释一下为什么?

最佳答案

@Darkmer

void * verif(void* argv){
pthread_mutex_lock(&锁);
int x=*(int*)argv;
printf("%p 存储 %d",argv,n);
//添加这一行。在您的代码中。

你会明白,每次你发送相同的地址,因此相同的 n(在你的样本中是 5)。为什么会这样?发生这种情况是因为在线程使用 n 之前,您在 main 函数中使用下一个命令行参数并行更改了它。

发生这种情况是因为在主程序中,您对所有三个参数使用了相同的“n”。相反,推迟 atoi 函数并在 verif() 中使用它。直接从命令行参数传递 argv。我可以为您更改 pthread_create(..) 函数,但这是您的家庭作业。

祝你好运。

关于c - 使用 pthread_mutex_lock 时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37234791/

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