Linux 上的线程程序(Posix 线程)
Thread Program on Linux (Posix Thread)
我想使用这个 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 个线程的程序,这些线程协同工作以添加一个数字。但我不知道如何更改它,再次感谢您提供的任何帮助。对不起,因为我不善于解释。
我不太确定你想要什么,但下面是一个基于现有代码的非常快速和肮脏的解决方案。我假设您只希望两个线程将单个变量与输入相加。
对发生的事情的解释:我必须修复代码中的一些小语法问题,一个大问题是运行器函数定义末尾的分号。我添加了一个互斥锁来定义运行程序的 for 循环中的关键部分。它确保只有 1 个线程可以更新总和。我假设您希望总和等于输入,所以我们只需将其递增 1 并在递增之前检查该值是否仍在下方。就像我说的,它又快又脏,不是真正理想的解决方案。要创建两个线程,我们只需在main中调用两次线程创建函数即可。
有关互斥锁和 pthread 库的更多重要信息,请参阅 https://computing.llnl.gov/tutorials/pthreads/#Mutexes。
#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);
}
用cc -o main main.c -pthread
编译。
首先有 3 个错误:pthread tid
声明没有“;”,然后在 runner()*
函数声明的末尾有一个错误,最后但并非最不重要的是,下划线是最后一行缺失 pthread_exit(0)
小心啊
变量还可以:
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" 并且它们应该并行工作(但我是否在 3 年前在我的 CS class 上看到过并行编程,它永远不会 "real real" 并行,因为只有 OS 可以控制它,你需要某种能够真正控制线程的超级root
我是说
它不会更快,因为它不是真正的并行程序
我想使用这个 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 个线程的程序,这些线程协同工作以添加一个数字。但我不知道如何更改它,再次感谢您提供的任何帮助。对不起,因为我不善于解释。
我不太确定你想要什么,但下面是一个基于现有代码的非常快速和肮脏的解决方案。我假设您只希望两个线程将单个变量与输入相加。
对发生的事情的解释:我必须修复代码中的一些小语法问题,一个大问题是运行器函数定义末尾的分号。我添加了一个互斥锁来定义运行程序的 for 循环中的关键部分。它确保只有 1 个线程可以更新总和。我假设您希望总和等于输入,所以我们只需将其递增 1 并在递增之前检查该值是否仍在下方。就像我说的,它又快又脏,不是真正理想的解决方案。要创建两个线程,我们只需在main中调用两次线程创建函数即可。
有关互斥锁和 pthread 库的更多重要信息,请参阅 https://computing.llnl.gov/tutorials/pthreads/#Mutexes。
#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);
}
用cc -o main main.c -pthread
编译。
首先有 3 个错误:pthread tid
声明没有“;”,然后在 runner()*
函数声明的末尾有一个错误,最后但并非最不重要的是,下划线是最后一行缺失 pthread_exit(0)
小心啊
变量还可以:
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" 并且它们应该并行工作(但我是否在 3 年前在我的 CS class 上看到过并行编程,它永远不会 "real real" 并行,因为只有 OS 可以控制它,你需要某种能够真正控制线程的超级root
我是说 它不会更快,因为它不是真正的并行程序