创建pthread时如何正确调用函数?

时间:2019-05-03 09:05:47

标签: c pthreads codeblocks

我正在主函数中创建一个pthread,并调用另一个名为“ PrintHello”的函数。 “ PrintHello”功能应打印一些消息。正在创建我的线程,但我猜我的函数“ PrintHello”由于未打印消息而未正确调用。

我在“ PrintHello”功能中输入了另一个打印命令,即正在打印。这意味着正在调用该函数。但是我不知道为什么邮件没有打印。

char *messages[NUM_THREADS];
struct thread_data
{
    int thread_id;
    int sum;
    char *message;
    };
struct thread_data thread_data_array[NUM_THREADS];

void *PrintHello(void *threadarg)
{
    printf("I am in PrintHello");
    int taskid , sum;
    char *hello_msg;
    struct thread_data *my_data;
    Sleep(1);
    my_data = (struct thread_data *) threadarg;
    taskid = my_data ->thread_id;
    sum = my_data ->sum;

    hello_msg = my_data ->message;
    printf("Thread %d: %s  Sum=%d\n", taskid , hello_msg , sum) ;

    pthread_exit(NULL);
}
int main(int argc , char *argv[])
{
    pthread_t threads[NUM_THREADS];
    int *taskids[NUM_THREADS];
    int rc, t, sum;
    sum=0;
    messages[0] = "English: Hello World!";
    ..............
    messages[7] = "Latin: Orbis , te saluto!";
for(t=0;t<NUM_THREADS;t++)
    {
        sum = sum + t;
        thread_data_array[t].thread_id = t;
        thread_data_array[t].sum = sum;
        thread_data_array[t].message = messages[t];
        printf("Creating thread %d\n", t);

        rc = pthread_create(&threads[t], NULL , PrintHello , (void *) &thread_data_array[t]);
        //rc = pthread_create(&threads[t], NULL , PrintHello , NULL);
        if (rc)
            {
                printf("ERROR; return code from pthread_create() is %d \n", rc);
                exit(-1);
            }
    }
        pthread_exit(NULL);
}

代码应打印出问候消息。

2 个答案:

答案 0 :(得分:1)

我认为正在发生的事情是您的应用程序在线程有机会完全执行之前就退出了。由于您将每个线程句柄存储在pthread_t threads[NUM_THREADS];数组中,因此您需要做的是在创建对 应该进行pthread_join,这将允许调用方线程被阻塞,直到该线程执行并返回为止。您可以在调用pthread_join之后立即调用pthread_create或遍历所有句柄并在数组中的每个索引上调用pthread_join。如果在分别创建每个线程之后对pthread_join进行了调用,则直到先前的线程完成后,才会产生一个新线程。如果您希望同时执行它们,那么在创建所有线程之后进行循环将是更好的选择。

int main(int argc , char *argv[])
{
    pthread_t threads[NUM_THREADS];
    int *taskids[NUM_THREADS];
    int rc, t, sum;
    sum=0;
    messages[0] = "English: Hello World!";
    ..............
    messages[7] = "Latin: Orbis , te saluto!";
    for(t=0;t<NUM_THREADS;t++)
    {
        sum = sum + t;
        thread_data_array[t].thread_id = t;
        thread_data_array[t].sum = sum;
        thread_data_array[t].message = messages[t];
        printf("Creating thread %d\n", t);

        rc = pthread_create(&threads[t], NULL , PrintHello , (void *) &thread_data_array[t]);
        //rc = pthread_create(&threads[t], NULL , PrintHello , NULL);
        if (rc)
        {
            printf("ERROR; return code from pthread_create() is %d \n", rc);
            exit(-1);
        }
    }
    for(int index = 0; index < NUM_THREADS; ++index){
        pthread_join(threads[index],NULL);//Wait for execution of each thread
    }
}

您也不需要在自己的主机中致电pthread_exit。通常,应该在希望提前终止的线程中调用该方法,在该线程中,可以从pthread_exit的第二个参数中检索传递到pthread_join的值

答案 1 :(得分:0)

对不起,您的回复很晚。我应该提到我正在使用Windows。无论如何,我发现了问题所在。这是由于“睡眠”参数而发生的。对于Windows,显然是不同的。所以我将sleep参数更改为Sleep(1000),这显然意味着在Windows中等待1秒,这解决了我的问题。感谢您的所有答复。