6

我正在研究 gcc ,我想知道这是否可能:

我有一个函数(不是main,而是aLocalFn),我在其中声明了一个局部变量。然后我将此本地参数作为线程参数传递。可行吗?或者有可能(取决于首先运行的内容)aLocalVar 在 threadFunction 运行之前会丢失,并且引用 idxPtr 将指向无意义?

int *threadFunction(void *idxPtr){
    int rec_idx=(int) *idxPtr;

    //work in the thread with this variabel rec_idx
}

int aLocalFn(){
   int aLocalVar=returnsRecordIndex();

   pthread_create(&thread_id,&attr_detached,threadFunction, &aLocalVar)!=0)
   return 0;
}   

感谢您的帮助

4

5 回答 5

8

此代码不正确。该函数aLocalFn可能在线程函数开始执行之前返回。因此,当线程函数读取局部变量时,该变量的作用域可能已经结束。

令人困惑的是,这段代码很可能看起来很有效,至少在某些时候。但是,这是不正确的,您应该改用堆分配的内存。

于 2012-05-21T09:49:40.720 回答
4

这是可行的,但在您问题的代码中没有完成。您必须添加一个信号变量来指示新线程何时使用该变量完成。然后你的外部函数可以返回。

static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t signal = PTHREAD_COND_INITIALIZER;
int done;

int *threadFunction(void *idxPtr){
    int rec_idx=(int) *idxPtr;

    pthread_mutex_lock(&lock);
    done = 1;
    pthread_cond_signal(&signal);
    pthread_mutex_unlock(&lock);

    //work in the thread with this variabel rec_idx
}

int aLocalFn(){
    int aLocalVar=returnsRecordIndex();

    done = 0;
    pthread_create(&thread_id,&attr_detached,threadFunction, &aLocalVar)!=0)
    pthread_mutex_lock(&lock);
    while (!done)
        pthread_cond_wait(&signal, &lock);
    pthread_mutex_unlock(&lock);
    return 0;
}   

请注意,此示例代码本身不是线程安全的(如果多个线程调用 aLocalFn)。

这确实使代码复杂化,并且锁定成本很高。因此,在大多数情况下,您最好将数据存储在堆中并让新线程或pthread_join代码释放它。

于 2012-05-21T10:13:24.677 回答
4

如果您只想传递一个整数,则您的代码与“aLocalVar”存在终身问题,这是一种不可移植的方法。它在某些平台上不起作用,但您不太可能遇到这些。

void threadFunction ( void * idxptr ) {
    int rec_idx = (int) idxptr;
    ....
}

int rec_idx = returnsRecordIndex();
pthread_create (&thread1, &attr_detached, (void *) &threadFunction, (void *)rec_idx);
于 2012-05-21T10:23:43.557 回答
2

@pizza 的回答是我会做的。你这样做的另一种方法是使用 malloc/free 正如@David 暗示的那样。我当然会在此处的其他答案中提出的等待循环中执行此操作。

int *threadFunction(void *idxPtr){
    int rec_idx = *(int *)idxPtr;
    // free up our int buffer
    free(idxPtr);
    ...
}

int aLocalFn(){
    int aLocalVar = returnsRecordIndex();
    // allocate some space for our int
    int *intBuf = (int *)malloc(sizeof(int));
    *intBuf = aLocalVar;
    pthread_create(&thread_id,&attr_detached,threadFunction, intBuf)!=0)
    return 0;
}   
于 2012-05-21T13:13:52.487 回答
1

每当您将变量传递给线程函数时,您的工作就是确保变量在线程函数完成使用之前保持有效和有效。

在您的情况下aLocalFn(),继续与新线程同时执行,甚至可能在线程之前完成执行,这会在线程函数中留下一个悬空指针(指向可能不存在的数据的指针),因为函数中的局部变量aLocalVar不再存在函数返回后。

于 2012-05-21T09:51:53.190 回答