pthread_join 和 pthread 奇怪的行为
pthread_join and pthread weird behaviour
我有 2 个进程,每个进程通过以下代码创建多个线程(本例中为 2 个)。当我将 pthread_join 放在 create 正下方时,它可以工作,但它总是按顺序调用线程。我想在不同的循环中进行连接,如下所示。问题是当我出于某种原因这样做时,它会创建相同线程的双倍而不是 2 个不同的线程。
所以当线程运行时它会打印类似
"线程 2.2 开始
线程 2.2 启动
线程 1.2 开始
线程 1.2 开始”
其中第一个数字是进程号,第二个数字是线程 no.They 应该是“1.2 1.1 2.1 2.2”。有人可以帮忙吗?
for(int i = 0; i<num_of_t;i++){
struct threadst args;
args.globalcp = globalcp;
args.lock = lock;
args.num1 = num1+i*((num2-num1+1)/num_of_t);
args.num2 = args.num1+((num2-num1+1)/num_of_t)-1;
args.threadid =i;
args.pid = myOrder;
pthread_create(&threads[i], &attr, findPrimes, (void *)&args);
pthread_join(threads[i], &status);
}
//for(int i = 0; i<num_of_t;i++){
//pthread_join(threads[i], &status);
//}
首先,您在每个线程创建时传递相同的对象 (&args
),因此它在所有线程之间共享。因此,根据需要给每个人自己的。
其次,不要在线程创建后立即调用pthread_join
,否则您将重新引入顺序性(join 是等待线程结束的阻塞操作)。通常您需要启动您的线程,并在稍后的某个时间点对您需要等待的线程调用 join。
// create an array of args to be passed each for a given thread
struct threadst *args = malloc(sizeof(struct threadst)*num_of_t;
// need a test for malloc...
for(int i = 0; i<num_of_t;i++){
struct threadst *arg = args+i;
arg->globalcp = globalcp;
arg->lock = lock;
arg->num1 = num1+i*((num2-num1+1)/num_of_t);
arg->num2 = arg->num1+((num2-num1+1)/num_of_t)-1;
arg->threadid = i;
arg->pid = myOrder;
pthread_create(&threads[i], &attr, findPrimes, (void *)arg);
}
// do something else in the meantime
for (int i = 0; i<num_of_t;i++) {
pthread_join(threads[i], &status);
}
我有 2 个进程,每个进程通过以下代码创建多个线程(本例中为 2 个)。当我将 pthread_join 放在 create 正下方时,它可以工作,但它总是按顺序调用线程。我想在不同的循环中进行连接,如下所示。问题是当我出于某种原因这样做时,它会创建相同线程的双倍而不是 2 个不同的线程。
所以当线程运行时它会打印类似 "线程 2.2 开始 线程 2.2 启动 线程 1.2 开始 线程 1.2 开始” 其中第一个数字是进程号,第二个数字是线程 no.They 应该是“1.2 1.1 2.1 2.2”。有人可以帮忙吗?
for(int i = 0; i<num_of_t;i++){
struct threadst args;
args.globalcp = globalcp;
args.lock = lock;
args.num1 = num1+i*((num2-num1+1)/num_of_t);
args.num2 = args.num1+((num2-num1+1)/num_of_t)-1;
args.threadid =i;
args.pid = myOrder;
pthread_create(&threads[i], &attr, findPrimes, (void *)&args);
pthread_join(threads[i], &status);
}
//for(int i = 0; i<num_of_t;i++){
//pthread_join(threads[i], &status);
//}
首先,您在每个线程创建时传递相同的对象 (&args
),因此它在所有线程之间共享。因此,根据需要给每个人自己的。
其次,不要在线程创建后立即调用pthread_join
,否则您将重新引入顺序性(join 是等待线程结束的阻塞操作)。通常您需要启动您的线程,并在稍后的某个时间点对您需要等待的线程调用 join。
// create an array of args to be passed each for a given thread
struct threadst *args = malloc(sizeof(struct threadst)*num_of_t;
// need a test for malloc...
for(int i = 0; i<num_of_t;i++){
struct threadst *arg = args+i;
arg->globalcp = globalcp;
arg->lock = lock;
arg->num1 = num1+i*((num2-num1+1)/num_of_t);
arg->num2 = arg->num1+((num2-num1+1)/num_of_t)-1;
arg->threadid = i;
arg->pid = myOrder;
pthread_create(&threads[i], &attr, findPrimes, (void *)arg);
}
// do something else in the meantime
for (int i = 0; i<num_of_t;i++) {
pthread_join(threads[i], &status);
}