Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将局部变量传递给线程。可能吗?_C_Multithreading_Arguments_Local Variables - Fatal编程技术网

C 将局部变量传递给线程。可能吗?

C 将局部变量传递给线程。可能吗?,c,multithreading,arguments,local-variables,C,Multithreading,Arguments,Local Variables,我在gcc工作, 我想知道这是否可能: 我有一个函数(不是main而是aLocalFn),我在其中声明了一个局部变量。然后我将这个局部参数作为线程参数传递。这可行吗?或者有可能(取决于首先运行的是什么)aLocalVar在threadFunction运行之前丢失,并且引用idxPtr将指向无感 int *threadFunction(void *idxPtr){ int rec_idx=(int) *idxPtr; //work in the thread with this

我在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;
}   

感谢您的帮助

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


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

每当您向线程函数传递变量时,您的工作就是确保变量在线程函数使用完毕之前保持活动和有效


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

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

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\u加入
code将其释放。

您的代码存在“aLocalVar”的生命周期问题 如果您只想传递一个整数,这里有一个不可移植的方法。 它在某些平台上不起作用,但您不太可能遇到这些平台

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

int rec_idx = returnsRecordIndex();
pthread_create (&thread1, &attr_detached, (void *) &threadFunction, (void *)rec_idx);

@比萨饼的答案就是我会做的。另一种方法是使用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;
}   

是的,这确实起到了作用,但这肯定不是一个好的解决方案。我相信你不会建议这样做,比如堆分配。我尽量不做超出问题所述范围的假设。在
aLocalFn
是回调的情况下,我需要类似的代码,数据返回时会自动释放。对于一个简单的
int
,这并不是一个好的解决方案,对于“不同”的答案,答案是+1。但是,我也不同意这是一个好的解决方案,因为它需要不必要地创建条件变量,并保持创建者线程资源等待创建完成。如果您知道代码只生成threadFunction的一个实例,那么这是一个可接受的解决方案。