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);
}