C Linux上的线程程序(Posix线程)

C Linux上的线程程序(Posix线程),c,linux,multithreading,pthreads,posix-api,C,Linux,Multithreading,Pthreads,Posix Api,我想使用这个pthreadapi修改Linux操作系统上的多线程程序 #include <pthread.h> #include <stdio.h> int sum; void *runner(void *param); int main(int argc, char *argv[]) { pthread_t tid pthread_attr_t attr; if (argc != 2) { fprintf(stder

我想使用这个pthreadapi修改Linux操作系统上的多线程程序

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

int sum;
void *runner(void *param);

int main(int argc, char *argv[]) {
    pthread_t tid
        pthread_attr_t attr;

    if (argc != 2) {
        fprintf(stderr, "usage: a.out <integer value>\n");
        return -1;
    }
    if (atoi(argv[1]) < 0) {
        fprintf(stderr, "%d must be >=0\n", atoi(argv[1]));
        return -1;
    }

    pthread_attr_init(&attr);
    pthread_create(&tid, &attr, runner, argv[1]);
    pthread_join(tid, NULL);

    printf("sum = %d\n", sum);
}

void *runner(void *param);
{
    int i, upper = atoi(param);
    sum = 0;

    for (i = 1; i <= upper; i++)
        sum += i;

    pthread exit(0);
}
#包括
#包括
整数和;
void*runner(void*param);
int main(int argc,char*argv[]){
pthread\u t tid
pthread_attr_t attr;
如果(argc!=2){
fprintf(stderr,“用法:a.out\n”);
返回-1;
}
if(atoi(argv[1])<0){
fprintf(stderr,“%d必须大于等于0\n”,atoi(argv[1]);
返回-1;
}
pthread_attr_init(&attr);
pthread_create(&tid,&attr,runner,argv[1]);
pthread_join(tid,NULL);
printf(“总和=%d\n”,总和);
}
void*runner(void*param);
{
int i,上限=atoi(参数);
总和=0;

对于(i=1;i我不确定您想要什么,但是下面是一个基于现有代码的快速而肮脏的解决方案。我假设您只需要两个线程将单个变量和输入相加

对发生的情况的解释:我必须修复代码中的一些小语法问题,一个大问题是运行程序函数定义末尾的分号。我添加了一个互斥来定义运行程序for循环中的一个关键部分。它确保只有一个线程可以更新和。我假设您希望和等于输入,所以我们只需将它增加1,并在增加之前检查该值是否仍然低于。正如我所说的,这是非常快速和肮脏的,并不是理想的解决方案。要创建两个线程,我们只需在main中调用两次thread create函数

有关互斥体和pthread库的更多重要信息,请参阅

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

int sum = 0; // set it once globally
pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
void *runner(void *param);

int main(int argc, char *argv[]) {
    pthread_t tid1, tid2;
    pthread_attr_t attr;

    if (argc != 2) {
        fprintf(stderr, "usage: a.out <integer value>\n");
        return -1;
    }
    if (atoi(argv[1]) < 0) {
        fprintf(stderr, "%d must be >=0\n", atoi(argv[1]));
        return -1;
    }

    pthread_attr_init(&attr);
    pthread_create(&tid1, &attr, runner, argv[1]);
    pthread_create(&tid2, &attr, runner, argv[1]);
    pthread_join(tid1, NULL);
    pthread_join(tid2, NULL);

    printf("sum = %d\n", sum);
}

void *runner(void *param) {
    int i, upper = atoi(param);
    // sum = 0;

    int t = pthread_self();

    for (i = 1; i <= upper; i++) {
        pthread_mutex_lock(&mtx);
        if (sum < upper) {
            printf("%d incrementing\n", t);
            sum += 1;
        }
        pthread_mutex_unlock(&mtx);
    }

    pthread_exit(0);
}
#包括
#包括
#包括
int sum=0;//全局设置一次
pthread\u mutex\u t mtx=pthread\u mutex\u初始值设定项;
void*runner(void*param);
int main(int argc,char*argv[]){
pthread_t tid1,tid2;
pthread_attr_t attr;
如果(argc!=2){
fprintf(stderr,“用法:a.out\n”);
返回-1;
}
if(atoi(argv[1])<0){
fprintf(stderr,“%d必须大于等于0\n”,atoi(argv[1]);
返回-1;
}
pthread_attr_init(&attr);
pthread_create(&tid1,&attr,runner,argv[1]);
pthread_create(&tid2,&attr,runner,argv[1]);
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
printf(“总和=%d\n”,总和);
}
无效*流道(无效*参数){
int i,上限=atoi(参数);
//总和=0;
int t=pthread_self();

对于(i=1;i首先有3个错误:
pthread tid
声明没有“;”,然后在
runner()*
函数声明的末尾有一个错误,最后一行
pthread\u exit(0)
当心啊哈

对于VAR,可以:

    pthread_t tid;
    pthread_t tid2;
    pthread_attr_t attr;
    pthread_attr_t attr2;
在ifs后面的代码中,添加以下内容:

pthread_attr_init(&attr);
pthread_attr_init(&attr2);
pthread_create(&tid, &attr, runner, argv[1]);
pthread_create(&tid2, &attr2, runner, argv[2]); // not sure for argv[2]?
不确定argv[2],这取决于它是否是两个不同的数字

pthread_join是没有用的,它们只是用来暂停线程,我认为如果你想让它们并行工作,你只需要做“pthread_create”,它们应该并行工作(但是3年前我在我的并行编程CS课上看到过,它永远不会是“真正的”了)并行,因为只有操作系统可以控制这一点,而您需要成为某种超级根用户才能真正控制线程

我是说
它不会更快,因为它不是真正的并行程序

请澄清您的具体问题或添加其他详细信息,以突出您所需要的内容。正如它目前所写的,很难准确说出您的问题。请参阅页面以获得澄清此问题的帮助。感谢您纠正我并帮助我,但在我编译之后它的程序输出是用法:a.out,我还是不知道understand@Chenz您在调用程序时是否为其提供输入?我的印象是,鉴于代码的结构,您希望提供输入,
/program\u name 12
非常感谢,抱歉,我忘了输入。我想问您一些问题如果有多个线程读取/写入一个变量(单个内存位置),当我尝试不使用互斥时,输出为sum=0你会得到各种疯狂的事情发生。如果你想要一致的结果,你必须通过某种方式提供互斥。互斥是一个。否则,写入单个内存位置将导致错误谢谢你纠正我并帮助我,但在我编译后,程序的输出是用法:a.out,我仍然不理解n您需要这样做。/a.out 4或例如。/a.out 3我的意思是只需在参数中写一个数字,不要忘记选择答案作为“您的问题的好答案”请啊哈,当我尝试此操作时。/a 4输出为sum=0。是否有错误?或者确实是输出错误。更新:当我输入30 40 50之类的数字时,输出不再是0,但30以下的数字始终为sum=0,并且写入了分段错误(内核转储)。我不知道为什么。。