[英]how to write pthread_create on the same function?
有人可以幫忙嗎? 我有以下幾點:
// part_1
if (pthread_create(&threadID, NULL, ThreadMain,
(void *) clientSocket) != 0) {
cerr << "Unable to create thread" << endl;
exit(1);
}
// part_2
void *ThreadMain(void *clientSocket) {
pthread_detach(pthread_self());
...
delete (TCPSocket *) clientSocket;
return NULL;
}
我希望在 part_1 中有 part_2(我的意思是不調用 TreadMain() 函數)
感謝您的回復
如果你能做到這一點呢?
pthread_create()
必須創建一個新堆棧供新線程使用。 如果pthread_create()
將現有線程的舊堆棧復制到單獨的內存塊中以創建新堆棧,那么指向其他局部變量的局部變量會發生什么? 新堆棧上的局部變量將指向舊堆棧。 當使用舊堆棧的線程(調用pthread_create()
的線程)返回或覆蓋它們時,這些變量開始指向無效數據。
但是fork()
呢? 為什么fork()
采用像pthread_create()
這樣的函數指針? 好吧,與pthread_create()
不同,由fork()
創建的新執行線程不必與舊執行線程位於相同的地址空間中,因為它們位於不同的進程中。 fork()
克隆父進程的虛擬地址空間、堆棧、堆等。 子進程的堆棧變量與父進程中的相應變量具有相同的虛擬地址。 因此,無論舊的父進程如何處理內存,新子進程中的所有指針都繼續有效*。
* Nitpicker 的角落:排除開始無效的指針,以及故意共享的內存
如果您只想將 part2 的函數移動到 part1 內,您可以在 part1 內創建一個本地類,使用靜態成員函數...
class LocalFunctor
{
public:
static void *ThreadFunc(void* clientSocket)
{
pthread_detach(pthread_self());
...
delete (TCPSocket *) clientSocket;
return NULL;
}
};
然后在 pthread_create 中調用 LocalFunctor::ThreadFunc
pthread_create(&threadID, NULL, LocalFunctor::ThreadFunc,(void *) clientSocket)
如果您要多次執行此操作,請查看 boost::thread 或將其包含在模板幫助程序類中。
您可以獲得一台裝有 OS 10.6 的 Apple Macintosh 計算機,然后開始使用 Grand Central Dispatch 進行編程。 Apple 添加了一些新的 C 編譯器功能,它們幾乎完全符合您的要求。 它們被稱為塊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.