pthread 中的多道程序有问题,只有部分程序工作
Have problems with multiprogramming in pthread, only part of the program works
我正在尝试编写打印“Hello World!”的代码10 次“sleep”一秒钟,然后程序应该打印“Hello Moon!” “睡眠”10 次,持续 0.2 秒。这个过程必须永远重复。问题是程序只打印“Hello World!” 10倍。我真的不明白如何让下一个线程到 运行!
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "wrapper.h"
#include <pthread.h>
#define MAX 10
void* HelloMoonFunction(void* tid){
long t_id;
t_id = (long)tid;
sleep(tid);
printf("%d. Hello Moon! \n", tid+1);
return NULL;
}
void* HelloWorldFunction(void* tid){
int value = (int) (intptr_t) tid;
sleep(value);
printf("%d. Hello World!\n", value + 1);
return NULL;
}
int main(int ac, char * argv){
pthread_t hej,moon;
while(1){
for (int a = 0; a < MAX; a++){
pthread_create(&hej, NULL, HelloWorldFunction, (void*)(intptr_t) a);
}
for (int b = 0; b < MAX; b++){
pthread_join(&hej, NULL);
}
for (int i = 0; i < MAX; i++){
pthread_create(&moon, NULL, HelloMoonFunction, (void*)(intptr_t) i);
}
for (int j = 0; j < MAX; j++){
pthread_join(moon, NULL);
}
}
pthread_exit(NULL);
return(0);
}
您的代码中最重要的问题是 10 个线程 ID 存储在同一个变量中,因此 10 个 pthread_join
都会为最后一个线程 ID 调用。
其次,传递给线程函数的数据是一个编码成指针的整数。这不能保证顺利进行。一种更便携的方法是保存参数并将指针传递给保存的值。但是,您的方法确实简化了代码,因此我将其保留在下面。请注意。
HelloMoonFunction()
中你想要的睡眠时间相差 0.2 秒无法用 sleep
实现(睡眠 n 秒),但是 Posix usleep
(休眠 n 微秒)可能可用,即使它已被 Posix 废弃。
根据我的理解,您想要完成的修改版本可能如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#define MAX 10
void* HelloMoonFunction(void* tid){
int value = (intptr_t)tid;
usleep(value*200000);
printf("%d. Hello Moon! \n", value+1);
return NULL;
}
void* HelloWorldFunction(void* tid){
int value = (intptr_t)tid;
usleep(value*1000000);
printf("%d. Hello World!\n", value + 1);
return NULL;
}
int main(void){
pthread_t hej[MAX], moon[MAX];
while(1){
for (int a = 0; a < MAX; a++){
pthread_create(&hej[a], NULL, HelloWorldFunction, (void *)(intptr_t)a);
}
for (int b = 0; b < MAX; b++){
pthread_join(hej[b], NULL);
}
for (int i = 0; i < MAX; i++){
pthread_create(&moon[i], NULL, HelloMoonFunction, (void *)(intptr_t)i);
}
for (int j = 0; j < MAX; j++){
pthread_join(moon[j], NULL);
}
}
return(0);
}
我正在尝试编写打印“Hello World!”的代码10 次“sleep”一秒钟,然后程序应该打印“Hello Moon!” “睡眠”10 次,持续 0.2 秒。这个过程必须永远重复。问题是程序只打印“Hello World!” 10倍。我真的不明白如何让下一个线程到 运行!
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "wrapper.h"
#include <pthread.h>
#define MAX 10
void* HelloMoonFunction(void* tid){
long t_id;
t_id = (long)tid;
sleep(tid);
printf("%d. Hello Moon! \n", tid+1);
return NULL;
}
void* HelloWorldFunction(void* tid){
int value = (int) (intptr_t) tid;
sleep(value);
printf("%d. Hello World!\n", value + 1);
return NULL;
}
int main(int ac, char * argv){
pthread_t hej,moon;
while(1){
for (int a = 0; a < MAX; a++){
pthread_create(&hej, NULL, HelloWorldFunction, (void*)(intptr_t) a);
}
for (int b = 0; b < MAX; b++){
pthread_join(&hej, NULL);
}
for (int i = 0; i < MAX; i++){
pthread_create(&moon, NULL, HelloMoonFunction, (void*)(intptr_t) i);
}
for (int j = 0; j < MAX; j++){
pthread_join(moon, NULL);
}
}
pthread_exit(NULL);
return(0);
}
您的代码中最重要的问题是 10 个线程 ID 存储在同一个变量中,因此 10 个 pthread_join
都会为最后一个线程 ID 调用。
其次,传递给线程函数的数据是一个编码成指针的整数。这不能保证顺利进行。一种更便携的方法是保存参数并将指针传递给保存的值。但是,您的方法确实简化了代码,因此我将其保留在下面。请注意。
HelloMoonFunction()
中你想要的睡眠时间相差 0.2 秒无法用 sleep
实现(睡眠 n 秒),但是 Posix usleep
(休眠 n 微秒)可能可用,即使它已被 Posix 废弃。
根据我的理解,您想要完成的修改版本可能如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#define MAX 10
void* HelloMoonFunction(void* tid){
int value = (intptr_t)tid;
usleep(value*200000);
printf("%d. Hello Moon! \n", value+1);
return NULL;
}
void* HelloWorldFunction(void* tid){
int value = (intptr_t)tid;
usleep(value*1000000);
printf("%d. Hello World!\n", value + 1);
return NULL;
}
int main(void){
pthread_t hej[MAX], moon[MAX];
while(1){
for (int a = 0; a < MAX; a++){
pthread_create(&hej[a], NULL, HelloWorldFunction, (void *)(intptr_t)a);
}
for (int b = 0; b < MAX; b++){
pthread_join(hej[b], NULL);
}
for (int i = 0; i < MAX; i++){
pthread_create(&moon[i], NULL, HelloMoonFunction, (void *)(intptr_t)i);
}
for (int j = 0; j < MAX; j++){
pthread_join(moon[j], NULL);
}
}
return(0);
}