如果将堆栈变量的地址传递给pthread函数会怎样?

时间:2018-12-12 15:02:53

标签: c linux pthreads

我写了一个程序让线程有序地执行,但是当我将堆栈变量的地址传递给线程函数时,程序总是等待,这里是程序:

param($eventSource)

我付出了一些努力。当我将i传递给线程函数和#include <pthread.h> #include <stdio.h> #include <unistd.h> pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t order_cond = PTHREAD_COND_INITIALIZER; int count = 0; void* thread_print(void* num){ sleep(10); int number = *(int*)num; //printf("%d", number); for(int i = 0; i < 10; i++){ pthread_mutex_lock(&mutex); while((count%3)!=number){ pthread_cond_wait(&order_cond, &mutex); } switch(number){ case 0:{ printf("A"); break; } case 1:{ printf("B"); break; } case 2:{ printf("C"); break; } } count++; pthread_mutex_unlock(&mutex); pthread_cond_broadcast(&order_cond); } return (void*)0; } int main(){ pthread_t p_id[3]; printf("fail\n"); void* tret; for(int i = 0; i<3;i++){ int success = pthread_create(&p_id[i], NULL, thread_print, (void*)&i); if(success != 0){ printf("fail\n"); } } for(int i = 0; i < 3; i++){ pthread_join(p_id[i], &tret); } //sleep(10); pthread_mutex_lock(&mutex); while(count < 30){ pthread_cond_wait(&order_cond, &mutex); } pthread_mutex_unlock(&mutex); return 0; } 时,它可以很好地工作。 那么,当我仅将i的地址传递给线程函数时会发生什么?

1 个答案:

答案 0 :(得分:1)

  

但是当我将堆栈变量的地址传递给线程函数时,程序总是等待。

将自动变量的地址传递给线程函数没有固有的问题。实际上,这样做是相当普遍的。但是,存在一个问题,在指向变量的生存期结束后,线程函数会取消对指针的引用,并且如果指向变量的值存在,则可能会出现另一种问题被另一个线程(例如父线程)更改。

您的程序遇到两种问题:它传递局部变量i的地址,然后更改该变量的值,并且然后该变量的生命周期在循环终止时结束,在线程尝试使用指针之前,很容易发生这种情况。

您可以通过适当的同步来解决这两个问题,以确保线程函数在循环移至下一个迭代之前读取变量。对于每个符合要求的实现,这都是正确的解决方案。

但是,将它们 convert i转换为指针,传递结果,并让线程函数将其转换回指针可能会更容易。两种转换都表现出实现定义的行为,但实际上,这在大多数系统上都可以正常工作。您的实施文档应该提供足够的详细信息,以确定您是否愿意支持该方法。

例如:

    // Note that 'i' itself is converted to void *
    int success = pthread_create(&p_id[i], NULL, thread_print, (void *) i);
    // ...

void *thread_print(void *num) {
    // Note that 'num' is converted directly (back) to an int, not dereferenced
    int number = (int) num;
    // ...

也请注意,sleep()不能解决同步问题。最好将其隐藏起来,但是在您的特定情况下,它会使它们更加突出。