簡體   English   中英

創建線程(POSIX 線程)

[英]Creating threads (POSIX threads)

我想知道為什么 Master 首先執行printf()即使 Slave 線程在代碼中排在第一位?

另外,為什么它們具有相同的 PID(主從)?

void* pthread_function(int id) {
  printf("[%s] Slave thread %d (PID=%d,TID=%ld)\n",timestamp(),id,getpid(),pthread_self());
  pthread_exit(NULL);
}
int main(int argc,char** argv) {
  // Create slave thread
  long int i = 1;
  pthread_t thread;
  pthread_create(&thread,NULL,(void* (*)(void*))pthread_function,(void*)(i));
  // Print message
  printf("[%s] Master thread (PID=%d,TID=%ld)\n",timestamp(),getpid(),pthread_self());
  // Wait for threads
  pthread_join(thread,NULL);
  // Terminate process OK
  return 0;
} 

output 是

[2019:11:20 00:25:25:853640] Master thread (PID=5338,TID=140000137201472)
[2019:11:20 00:25:25:853795] Slave thread 1 (PID=5338,TID=140000128689920)

對不起,我是新手,答案可能很簡單,我不知道。

當這個程序執行時,事件的順序是這樣的:

  • 執行的主程序。
  • 它啟動了子線程。
  • 巧合的是(!)它之前設法打印了它的消息......
  • ...新啟動的子線程打印了它的信息。
  • 然后子線程死了,然后......
  • ...等待它死去...主線程也死了。

如果你多次運行這個程序,那么最終你可能會遇到孩子“打敗父母”的情況。 (但這也與底層操作系統邏輯有關,它確保控制台的輸出始終由“整個字符串”組成。兩個進程/線程中的任何一個都有平等的機會首先獲得它們的字符串,但是你'永遠不會看到控制台 output 由混合的兩個字符串組成。

源代碼中語句的順序完全不相關。

多個線程是獨立調度的,因此 kernel 可能會決定先調度新線程還是舊線程,具體取決於其優先級和系統上正在運行的其他線程。 多次運行程序可能會導致不同的結果,甚至。

兩個線程共享相同 PID 的原因是因為 POSIX 說它們必須。 即使有多個線程,也只有一個進程。 kernel 在內部使用單獨的 PID 跟蹤兩個線程,但 glibc 將單個 PID(主線程的 PID)公開為進程的 PID。

暫無
暫無

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

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