CreateThread與pthread

電腦雜談  發布時間:2019-07-04 03:05:53  來源:網絡整理

pthread_create 參數_pthread_create線程_pthread_create 第一個參數

創建線程

在 Windows 中,您可以使用 CreateThread() 來創建線程,創建的線程在調用進程的虛擬地址空間中運行。

HANDLE CreateThread(

LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD

SIZE_T dwStackSize, // initial stack size

LPTHREAD_START_ROUTINE lpStartAddress, // thread function

pthread_create 參數_pthread_create 第一個參數_pthread_create線程

LPVOID lpParameter, // thread argument

DWORD dwCreationFlags, // creation option

LPDWORD lpThreadId // thread identifier

);

lpThreadAttributes 是指向線程屬性的指針,決定了線程句柄是否能由子進程繼承。

Linux 使用 pthread 庫調用 pthread_create() 來派生線程:

pthread_create 第一個參數_pthread_create 參數_pthread_create線程

int pthread_create (

pthread_t *thread_id,

pthread_attr_t *threadAttr,

void * (*start_address)(void *),

void * arg);

當使用fork系統 調用時,內核調用do_fork()不使用任何共享屬性,進程擁有獨立的運行環境,而使用pthread_create()來創建線程時,則最終設置了所 有這些屬性來調用__clone(),而這些參數又全部傳給核內的do_fork(),從而創建的"進程"擁有共享的運行環境,只有棧是獨立的,由 __clone()傳入。當使用fork系統 調用時,內核調用do_fork()不使用任何共享屬性,進程擁有獨立的運行環境,而使用pthread_create()來創建線程時,則最終設置了所 有這些屬性來調用__clone(),而這些參數又全部傳給核內的do_fork(),從而創建的"進程"擁有共享的運行環境,只有棧是獨立的,由 __clone()傳入。當創建線程成功時,函數返回0,若不為0則說明創建線程失敗,常見的錯誤返回代碼為eagain和einval.前者表示系統限制創建新的線程,例如線程數目過多了。

pthread_create線程_pthread_create 參數_pthread_create 第一個參數

CreateThread() 中的 lpStartAddress 參數是剛創建的線程要執行的函數的地址。

由于pthread 庫不是 linux 系統默認的庫,連接時需要使用靜態庫 libpthread.a,所以在使用pthread_create()創建線程,以及調用 pthread_atfork()函數建立fork處理程序時,在編譯中要加 -lpthread參數。當調用pthread_create()創建新線程后當前線程從pthread_create()返回繼續往下執行,而新線程執行的代碼由函數指針start_routine決定start_routine函數接受一個參數是由pthread_create()通過參數arg傳遞的,這個參數的類型是void *按什么類型解釋由用戶自己決定。先說說用getmodulehandle函數獲取.此方法需要用createremotethread函數在遠程進程中創建線程,讓該線程調用kernel32.dll中的getmodulehandle函數.但是只這樣還不行.因為getmodulehandle函數需要以dll模塊文件名做參數.既然是遠程線程調用getmodulehandle函數.還需要先把dll模塊文件名寫入目標進程的地址空間中.最后用createremotethread函數創建線程執行getmodulehandle函數來獲取dll句柄。

在 Windows 中,系統調用 CreateThread() 的參數 lpParameter 指定了要傳遞給剛創建的線程的參數。它指明了將要傳遞給新線程的數據條目的地址。

由于pthread 庫不是 linux 系統默認的庫pthread_create 參數,連接時需要使用靜態庫 libpthread.a,所以在使用pthread_create()創建線程,以及調用 pthread_atfork()函數建立fork處理程序時,在編譯中要加 -lpthread參數。由于pthread 庫不是 linux 系統默認的庫,連接時需要使用靜態庫 libpthread.a,所以在使用pthread_create()創建線程,以及調用 pthread_atfork()函數時,在編譯中要加 -lpthread參數。由于pthread庫不是linux系統默認的庫,連接時需要使用庫libpthread.a,所以在使用pthread_create創建線程時pthread_create 參數,在編譯中要加-lpthread參數:。

在 Windows 中,CreateThread() 的參數 dwStackSize 是將要分配給新線程的以字節為單位的棧大小。棧大小應該是 4 KB 的非零整數倍,最小為 8 KB。

在 Linux 中,棧大小程屬性對象中設置;也就是說,將類型為 pthread_attr_t 的參數 threadAttr 傳遞給庫調用 pthread_create()。在設置任何屬性之前,需要通過調用 pthread_attr_init() 來初始化這個對象。使用調用 pthread_attr_destroy() 來銷毀屬性對象:

pthread_create 第一個參數_pthread_create線程_pthread_create 參數

int pthread_attr_init(pthread_attr_t *threadAttr);

int pthread_attr_destroy(pthread_attr_t *threadAttr);

為了區別是否是創建控件的線程訪問該控件,windows應用程序中每一個控件對象都有一個invokerequired屬性,用來檢查是否需要通過調用invoke方法完成其他線程對該控件的操作,如果該屬性為true.說明是其他線程操作該控件,這時可以創建一個委托實例,然后調用控件對象的invoke方法,并傳入需要的參數完成相應操作,否則可以直接對該控件對象進行操作,從而保證了其他線程安全操作本線程中的控件.。為了區別是否是創建該控件的線程訪問該控件,windows窗體控件中的每個控件都有一個invokerequired屬性,這個屬性就是用來檢查本控件是否被其他線程調用的屬性,當被創建該線程外的線程調用的時候invokerequired就為true。當使用fork系統 調用時,內核調用do_fork()不使用任何共享屬性,進程擁有獨立的運行環境,而使用pthread_create()來創建線程時,則最終設置了所 有這些屬性來調用__clone(),而這些參數又全部傳給核內的do_fork(),從而創建的"進程"擁有共享的運行環境,只有棧是獨立的,由 __clone()傳入。

通常情況下,缺省10m的線程棧空間顯然是太大了,所以建議通過調用pthread_attr_setstacksize()api來改變線程棧的大小。pthread_attr_setstacksize()函數設置線程屬性attr中棧大小屬性值。dwstacksize:線程棧大小,如果為0,那么默認將使用與調用該函數的線程相同的棧空間大小(整數型)。

在 Windows 中,系統調用 ExitThread() 會終止線程。 dwExitCode 是線程的返回值,另一個線程通過調用 GetExitCodeThread() 就可以得到它。

VOID ExitThread(

DWORD dwExitCode // exit code for this thread

);

只應該在onmessage消息處理函數內部調用default調用缺省的窗口過程,它提供了對應用程序沒有處理的任何窗口消息的缺省處理pretranslatemessage在消息被發送到windows函數translatemessage和dispatchmessage之前,cwinapp使用這個函數來過濾窗口消息sendmessage向cwnd對象發送一個消息,直到這條消息被處理之后才返回postmessage將一條消息放入應用程序的消息隊列,然后不等窗口處理這條消息直接返回sendnotifymessage將一條消息發送到窗口并盡快返回,返回的速度取決于該窗口是否是由調用線程所創建。{2}中斷向量返回后通過cortex-m的咬尾中斷機制直接進入pendsv向量,pendsv構造一個假的異常堆棧,通過這個假的異常堆棧程環境下調用hal_interrupt_end函數,從pendsv返回后,因為假的異常堆棧的存在并不返回當前線程被中斷的代碼處繼續執行,而是返回到hal_interrupt_end函數,此外假的異常堆棧將hal_interrupt_end函數的返回點設置為hal_interrupt_end_done。如果僅僅是使用互斥量來同步,則就可能出現前面的忙等待(即使調用sched_yield也只是延遲了而已),而使用條件變量后,則線程就可以阻塞休眠了,直到需要的條件發生(在這里就是nready.nready的值非零),而改變這個條件的線程也是通過條件變量(以條件變量做為參數調用pthread_cond_signal或pthread_cond_broadcast)來通知阻塞在相應條件變量的線程。


本文來自電腦雜談,轉載請注明本文網址:
http://www.gefhbj.live/a/jisuanjixue/article-110332-1.html

    相關閱讀
    發表評論  請自覺遵守互聯網相關的政策法規,嚴禁發布、暴力、反動的言論

    熱點圖片
    拼命載入中...
    少林宝藏100在线客服