簡體   English   中英

如何在同一個函數上編寫 pthread_create ?

[英]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.

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