You will never walk alone!
線程控制
APUE講的destroy會free空間,這件事情看起來不太對,也許是Base on實現起碼我看到的實現是沒有做這件事情的。
Attribution有下面這些。
我們可以用malloc和mmap給Thread分配stack,指定stack大小和位置(低地址)
mutex屬性兩個東西1.進程共享屬性,PTHREAD_PROCESS_PRIVATE or SHARED意思是說如果這個Mutex是分配在兩個進程共享的memory,然后設置為shared mutex就可以用于進程同步2.類型屬性,normal;errorcheck;recurive意思是定義Mutex本身的特性,這里更正下前面那章提到的錯誤只有normal的mutex才會在再次加鎖時發生deadlockerrorcheck的會直接返回錯誤recurive本身就允許,會有計數
rw lock和condition屬性只支持第一個TLS變量先看下TLS的位置
pthread_internal_t是記錄線程自己本身的一些屬性的變量,guard page就是線程attr上設置的防止棧溢出的擴展內存創建TLS變量的方法1.創建Key,這個Key是這個Process中所有Thread可以共享訪問的,然后每個Thread自己去關聯自己的Thread Local變量int pthread_key_create(pthread_key_t *keyp, void (*destructor)(void*))創建key的時候需要保證唯一調用,也就是不會有兩個Thread同時調用,然后發生一些base on實現的不確定的結果,可以使用pthread_oncepthread_once的實現很簡單,用mutex做互斥量保證pthread_once_t的訪問,然后利用pthread_once_t做flag來調用init_routine
所以這個pthread_once_t必須是全局or靜態變量pthread_once最常用的case除了拿到TLS key外,init函數經常會使用這個,避免多線程同時調用。然后就是thread cancelAndroid Bionic庫沒有實現 pthread_setcancelstate(int state, int* oldstate)以及pthread_cancel()這里thread的取消,有些是取消不掉的,例如一些blocking call,所有的取消均是需要設定一些取消點的,有人有專門針對Android沒有Thread Cancel來想辦法基本就是thread signal,在signal handler中去call pthread_exit();or用PIPE在多路復用中break出來http://blog.csdn.net/langresser/article/details/8531112如果信號與硬件故障or計時器超時相關,那么信號會發送到引起事件的該線程中去,其他信號會發送到任意一個線程。這里是說的POSIX線程模型,一般的信號都會發送給進程中沒有阻塞該信號的某個線程。APUE講的某個沒有阻塞該信號的線程,其實有點模糊。但是Linux的實現不一樣,linux的thread是clone出來的,就是共享資源的獨立進程,這樣子其實蠻自然的,也不容易復雜。linux中,有可能線程就不會注意到該信號,這樣講也有點模糊,總之終端驅動程序的信號會將信號通知到進程組,這樣子所有的thread就會都收到信號如果你不想所有的線程都去關心信號,那么可以使用一個專門處理信號的線程先將其他線程的signal都pthread_sigmask SIG_BLOCK掉,然后使用sigwait在特定的線程來等pthread_sigmask和sigprocmask很像thread與forkfork后的子進程會繼承mutex, rw lock, condition的狀態但是子進程中只會存在一個線程,也就是那個調用fork的線程的副本,有個復雜的事情是關于上面繼承下來的那些東西,子進程由于只有一個線程,沒辦法知道上面那三個東西的具體狀態,需要有個清理鎖的動作 -->pthread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void))我目前不知道這個東西的使用場景,而且不容易控制。因為一般如果我們fork后都會接execu,這樣地址空間就會改變,那么這些繼承的東西就沒用了。然后有談一點關于線程IO的東西pwrite/pread也就是原子的進行lseek和r/w,但是這個并不能保證大家常見的沖突問題,也就是一個thread在寫另外一個要讀,所以這兩個東西并不能解決同步的問題。作業:12.3 理論上函數開始時屏蔽所有信號,函數結束時恢復,是可以做到異步信號安全的。如果你只是屏蔽一些信號,那么沒辦法做到,因為如果有其他信號進來,你call的函數里面有一些不可重入的函數,同樣不能保證是異步安全的。12.5 fork可以在拿來執行可執行程序,現在應該就這一個Case。
Powered by: C++博客 Copyright © Torres