作者 主題: pthread_create return 0,但用ps command看不到該thread???  (閱讀 8816 次)

0 會員 與 1 訪客 正在閱讀本文。

hillvskobe

  • 懷疑的國中生
  • **
  • 文章數: 30
    • 檢視個人資料
as title~

我用pthread_create去產生一個thread,而且成功 return 0,
但用ps command卻看不到該thread???
請問有什麼可能的原因呢?
該如何解決???


BR,

elleryq

  • 鑽研的研究生
  • *****
  • 文章數: 908
  • 性別: 男
    • 檢視個人資料
    • Thinking more...
要加參數

ps -eLf

ps axms

請詳查 man ps

或者改用 pstree...
Plan your work, then work your plan.
我的首頁:http://blog.elleryq.idv.tw
351899by http://counter.li.org

hillvskobe

  • 懷疑的國中生
  • **
  • 文章數: 30
    • 檢視個人資料
要加參數

ps -eLf

ps axms

請詳查 man ps

或者改用 pstree...



我是用busybox的ps指令看的,
他只有w這個option而已,
但我想這不單只是thread沒被顯示出來而已,
因為該thread我是要用來在收到某一訊息之後在畫面上show出,
而我確認是有送訊息到該thread的,
但卻沒印在畫面上,
唯一的可能是該thread不存在,
但為何pthread_create回傳的值是0呢???


anderson1127

  • 訪客
嗯....

看來,有人對thread這東西還以為是Process...
thread 與 Process觀念是不一樣的  !!

所以,可以成功create thread ,但不代表用process tool (如 ps)
就可以看見thread !!

另外,我對thread的觀念是用OS來看待, 更正確的說法,要看誰去create thread
就用誰的立場來看待thread . 比如說,你用user space的方式寫了一個code
這個code run起來後,很自然的本身就用它自我的角度,來看待它自己產生的一個
thread , 但不能用OS的角度來看待這個code產生的thread !!

PS: 我沒念任何的programming about thread,會想通這個道理,說來也有點奇
是我在某一家公司裡做networking engineer時,與programming同事玩耍時
突然靈光一閃,就這樣明白何謂thread !! 很奇怪吧 ?? 呵呵....

kenduest

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3675
    • 檢視個人資料
    • http://kenduest.sayya.org

要先自己 debug 一下,你這樣問很難回答你問題的。若你的 thread 建立後沒做啥事情就再見了,那當然看不到。

我寫一段 code 測試:

代碼: [選擇]
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void *my_sub(void *msg);

main()
{
     pthread_t thread;
     int handle;
     char msg[]="Hello World";

     handle = pthread_create( &thread, NULL, my_sub, (void*) msg);
     pthread_join( thread, NULL);
     printf("Thread return: %d\n",handle);
     return 0;
}

void *my_sub(void *msg)
{
     printf("Hello from thread: %s \n", (char *) msg);
     sleep(10);
}

編譯執行後輸出:

代碼: [選擇]
$ ./a.out
Hello from thread: Hello World
Thread return: 0

當時候使用 top 觀察,搭配 u 按鍵指定查看自己行程,然後按下 H 查看 thread process :

代碼: [選擇]
17315 kendlee   20   0 10068  456  376 S  0.0  0.0   0:00.00 a.out
17316 kendlee   20   0 10068  456  376 S  0.0  0.0   0:00.00 a.out

再次執行,使用 ps auxH 查看:

代碼: [選擇]
ps auxH | fgrep a.out
kendlee  17890  0.0  0.0  10068   460 pts/1    Sl+  00:47   0:00 ./a.out
kendlee  17890  0.0  0.0  10068   460 pts/1    Sl+  00:47   0:00 ./a.out

給你參考。
I am kenduest - 小州

my website: http://kenduest.sayya.org/

anderson1127

  • 訪客
kenduest大

說實話,這個example 我看不出來與fork()後的寫法有何不同...
同樣都是以OS的觀點來看待 process

既然如此,又何必用pthread library 來Call pthread ??

elleryq

  • 鑽研的研究生
  • *****
  • 文章數: 908
  • 性別: 男
    • 檢視個人資料
    • Thinking more...
我是用busybox的ps指令看的,

可以去 ls /proc/<pid>/task
沒建 thread 的話,這裡只會有一個目錄
如果有建 thread,則會有多個目錄..
Plan your work, then work your plan.
我的首頁:http://blog.elleryq.idv.tw
351899by http://counter.li.org

hillvskobe

  • 懷疑的國中生
  • **
  • 文章數: 30
    • 檢視個人資料

要先自己 debug 一下,你這樣問很難回答你問題的。若你的 thread 建立後沒做啥事情就再見了,那當然看不到。

我寫一段 code 測試:

代碼: [選擇]
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void *my_sub(void *msg);

main()
{
     pthread_t thread;
     int handle;
     char msg[]="Hello World";

     handle = pthread_create( &thread, NULL, my_sub, (void*) msg);
     pthread_join( thread, NULL);
     printf("Thread return: %d\n",handle);
     return 0;
}

void *my_sub(void *msg)
{
     printf("Hello from thread: %s \n", (char *) msg);
     sleep(10);
}

編譯執行後輸出:

代碼: [選擇]
$ ./a.out
Hello from thread: Hello World
Thread return: 0

當時候使用 top 觀察,搭配 u 按鍵指定查看自己行程,然後按下 H 查看 thread process :

代碼: [選擇]
17315 kendlee   20   0 10068  456  376 S  0.0  0.0   0:00.00 a.out
17316 kendlee   20   0 10068  456  376 S  0.0  0.0   0:00.00 a.out

再次執行,使用 ps auxH 查看:

代碼: [選擇]
ps auxH | fgrep a.out
kendlee  17890  0.0  0.0  10068   460 pts/1    Sl+  00:47   0:00 ./a.out
kendlee  17890  0.0  0.0  10068   460 pts/1    Sl+  00:47   0:00 ./a.out

給你參考。


我產生的thread是一個while(1)迴圈,所以應該不會沒作啥事就結束~

kenduest

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3675
    • 檢視個人資料
    • http://kenduest.sayya.org

上面的程式碼你就自己跑看看然後觀察吧。
I am kenduest - 小州

my website: http://kenduest.sayya.org/

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5413
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
某些 OS 對於 thread 的確是當成 process 在看待.
兩者在不同的 OS, 可能是不同的東西, 也可能是相同的東西.