gpt4 book ai didi

c - Peterson 的 C 线程并发算法(段错误)

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:46:29 25 4
gpt4 key购买 nike

大家好,我正在用 C 语言实现 Peterson 的算法。我有两个函数将由创建的线程执行,一个将变量加 1,另一个将同一个变量减 1。

该程序接收一个 int 类型的参数,该整数是我要创建的线程数的平方根,例如,如果我在终端输入中执行它./algorithm 10,将创建 10*10 (10 000) 个线程。

如果 y 键入小于 170 作为参数(将创建 28900 个线程),程序运行正常,但如果我想创建更多线程,我会遇到段错误,尝试使用“long long int”变量,但那是是吧。

有一个名为“cont”的计数器,每次 cont 达到 10000 时都会打印该变量。变量的最后一个结果还有另一个打印,它应该始终为 0,因为 n 个线程加 1,n 个线程减 1。

我想知道为什么会出现段错误,是否存在要创建的线程限制,或者它是否在我的代码中。

我正在使用下一个命令运行它以仅使用一个处理器,因为 Peterson 的算法只能在单处理器系统上完美运行:

taskset -c 0 ./alg3 100

代码如下:

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




long int n;
long int var = 0;
long int cont = 1;
int flag[] = {0, 0};
int turn = 0;

void* sum(void* data) {
//int n = *((int*)data);
int i;

turn = 2;
flag[0] = 1;
while (turn == 2 && flag[1]);
cont++;
var += 1;
if (cont == 10000) {
printf("varsum=%ld\n", var);
cont = 1;
}

flag[0] = 0;
}

void* rest(void* data) {
//int n = *((int*)data);
int i;
turn = 1;
flag[1] = 1;
while (turn == 1 && flag[0]);
cont++;
var -= 1;
if (cont == 10000) {
printf("varres=%ld\n", var);
cont = 1;
}

flag[1] = 0;

}

main(int argc, char *argv[]) {
long int i;
n = atoi(argv[1]);
n *= n; //n*n is the actual number of threads that will be created

pthread_t tid[n];


for (i = 0; i < n; i++) {
pthread_create(&tid[i], NULL, sum, NULL);
//cont++;

}
for (i = 0; i < n; i++)
pthread_join(tid[i], NULL);

for (i = 0; i < n; i++) {
pthread_create(&tid[i], NULL, rest, NULL);
//cont++;

}
for (i = 0; i < n; i++)
pthread_join(tid[i], NULL);

printf("main() reporting that all %ld threads have terminated\n", i);
printf("variable=%ld\n", var);

} /* main */

最佳答案

首先,创建线程当然是有限制的。它由每个线程和硬件的堆栈大小决定,详细信息建议谷歌它......段错误原因:您没有检查函数pthread_create 的返回值,当'n' 足够大时,pthread_create 将失败,然后pthread_join 可能使用不存在的thread_t 作为第一个输入参数。以下代码(从您的示例更改)可以测试您可以创建多少个线程。

int rc = 0, thread_num = 0;
for (i = 0; i < n; i++) {
rc = pthread_create(&tid[i], NULL, sum, NULL);
if (rc)
{
printf("pthread_crate failed, thread number: %d, error code: %d\n", thread_num, rc);
}
thread_num++;
}
printf("created %d threads.\n", thread_num);

关于c - Peterson 的 C 线程并发算法(段错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22239987/

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