簡體   English   中英

如何將參數傳遞給 C 中的 pthread 線程 function?

[英]How to pass an argument to a pthread thread function in C?

是否可以將參數傳遞給 pthreads 中的線程 function? 假設我創建了一個線程:

int main() {
  pthread_t t1;
  pthread_create(&t1, NULL, callback, 10);
  pthread_join(t1, NULL);
  return 0;
}

callback中,我只想打印出10 我現在的問題是,根據 C pthread APIpthread_create() function 簽名是:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);

我可以將指向 integer 的指針傳遞給線程 function 嗎?

您可以使用變量,例如:

  int val = 10;
  pthread_create(&t1, NULL, callback, &val);
  pthread_join(t1, NULL);
  ...

callback中:

void* callback(void *arg)
{
    int i = *(int *)arg;
    ....

    return NULL;
}

請注意,這是有效的,因為val的生命周期在您等待pthread_join()時線程( callback )完成其執行之前是有效的。 否則,您可能希望動態分配 memory (例如malloc )並將 object 傳遞給線程 ZC1C4245268E67A94FC1

對於不比intptr_t寬的 integer 類型的單個值,在pthread_create調用中將其轉換為指針並將其轉換回線程 function 是可能且相當普遍的:

int main() {
    pthread_t t1;
    pthread_create(&t1, NULL, callback, (void *) 10);
    pthread_join(t1, NULL);
    return 0;
}


void *t1(void *arg) {
    int arg_as_int = (int) arg;
    // ...
}

這種鑄造絕對是允許的,而且是非常傳統的。

我最近開始在 SO 上看到對這種方法的反對意見,但是,基於 C 標准允許這些轉換中的第一個產生陷阱表示,並且它不需要int往返void *int是保值的。 該論點正確地描述了 C 標准的特征,但它忽略了以下事實,即作為實際問題,強制轉換方法基本上適用於支持 Z4069B248C57DD4625F9E019410AEB90 的所有 C 實現,而不是最常見的實現,可靠的工作很難被接受。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM