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

时间:2019-02-25 03:27:37

标签: c linux multithreading pthreads posix-api

我想使用此Pthread API在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);
}

我想将该程序更改为具有 2个线程的程序,这些线程可以一起添加数字。但是我不知道如何更改它,再次感谢您可以提供的任何帮助。对不起,因为我不善于解释。

2 个答案:

答案 0 :(得分:0)

我不确定您想要什么,但是下面是一个基于现有代码的非常快速而肮脏的解决方案。我假设您只希望两个线程将单个变量求和到输入中。

发生的事情的解释:我不得不解决代码中的一些小语​​法问题,其中一个大问题是运行器函数定义末尾的分号。我添加了一个互斥锁来定义跑步者的for循环中的关键部分。确保只有1个线程可以更新总和。我假设您希望总和等于输入,因此我们只将其加1并在增加值是否仍低于此值之前进行检查。就像我说的那样,它既快速又肮脏,并不是理想的解决方案。要创建两个线程,我们只需在main中两次调用线程创建函数。

有关互斥锁和pthread库的更多信息,请参见https://computing.llnl.gov/tutorials/pthreads/#Mutexes

var regex = new Regex("[0-9]");
if (regex.IsMatch(textBox1.Text)) {
    MessageBox.Show("There was a number inside name textbox.","Error in name field!");
    return;
}
try {
    Convert.ToInt32(textBox2.Text);
} catch (Exception) {
    MessageBox.Show("The input in age field was not valid","Error in name field!");
    return;
}

使用#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); } 进行编译。

答案 1 :(得分:0)

首先有3个错误:pthread tid声明中没有“;”,然后在您的runner()*函数声明的末尾有一个错误,最后但并非最不重要的是,在下划线上缺少下划线最后一行pthread_exit(0) 当心啊

可以使用vars

    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],这取决于是否是2个不同的数字?

pthread_join没有用,它们仅在这里用于暂停线程,我认为如果您希望它们并行工作,则只需执行“ pthread_create”,它们就应该并行工作(但是我在CS上看到了3年前的并行编程类,它永远不会是“真正的”并行,因为只有操作系统才能控制此并行,并且您需要具有某种超级根才能真正控制线程

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