2010-12-01 37 views
0

如果我想通過pthread_create()將char *傳遞給各個線程,並且我希望它們獨立工作,那麼安全地使用它最簡單的方法是什麼?關於線程和可變複製的簡單問題(不需要同步)

我發現我得到不穩定的行爲,如果我做

僞代碼:

func1() { // part of a loop 
    Create var.. 
    func2(var); 
} 

func2(char* var) { // spawn a thread 
    pthread_create(.....,&func3,(void*)var); 
} 

func3(void* var) { 
    work with the var // unstable behavior 
} 

沒有必要進行任何數據通信,線程剛剛得到的VAR,然後忽略什麼程序的其餘部分是在做。他們只是在他們得到的變種上工作。

回答

1

您不會顯示程序的「Create var ...」部分的詳細信息,但正如Christopher Hunt正確回答的,如果它沒有聲明爲靜態,那麼當func1()返回時它將消失。但更糟糕的是,你說「不需要任何數據通信」,並且如果你創建了一次var並從多個線程訪問它,那麼無論你是否意味着「數據通信」(以及協調並行訪問到var是由你決定的)。

如果您希望每個線程真正擁有自己的副本,可以在不干擾其他線程的情況下搞砸,您可以在每次調用pthread_create()之前複製它。例如,您可以調用strdup()爲新線程分配字符串的私有副本,並將該副本傳遞給pthread_create()。

0

您需要小心範圍。如果您的var在堆棧中聲明,那麼一旦func1完成,它就會消失。要麼在堆上分配var,要麼作爲靜態分配。