pthread之執行緒堆疊
先來講說執行緒記憶體相關的東西,主要有下面幾條:
程序中的所有的執行緒共享相同的位址空間。
任何宣告為static/extern的變數或者堆變數可以被程序內所有的執行緒讀寫。
乙個線**正擁有的唯一私有儲存是處理器暫存器。
執行緒棧可以通過暴露棧位址的方式與其它執行緒進行共享。
注意:
下面的測試**在我自己的機子上(ubuntu6.06,ubuntu6.10,redhat 9, gentoo)通過了測試,但是很奇怪的是在我同事的機子上,無論是改變環境,還是想其它方法都不能正常的執行 。在網上查了一下,很多人也存在同樣的問題,至今不知道為何。
linux執行緒的實現方式決定了對程序的限制同樣加在了執行緒身上:)所以,有問題,請參見之執行緒棧空間(2)(進行棧)
直接看**吧,只有乙個c檔案(thread_attr.c)
#include
#include
#include "errors.h"
//執行緒體,在棧中分配乙個大小為15m的空間,並進行讀寫
void *thread_routine (void *arg)
printf( "get 15m memory!!!/n" );
//分配更多的記憶體(如果分配1024*1020*512的話就會出現段錯誤)
char p2[ 1024 * 1020 + 256 ];
memset( p2, 0, sizeof( char ) * ( 1024 * 1020 + 256 ) );
printf( "get more memory!!!/n" );
return null;
}int main (int argc, char *argv)
getchar();
printf ("main exiting/n");
pthread_exit (null);
return 0;
}看看執行過程:
dongq@dongq_lap ~/workspace/test/pthread_attr $ make
cc -pthread -g -ddebug -lrt -o thread_attr thread_attr.c
dongq@dongq_lap ~/workspace/test/pthread_attr $ ./thread_attr
default stack size is 8388608; minimum is 16384 //預設的棧大小為8m
default stack size is 16777216; minimum is 16384 //設定後的結果為16m
the thread is here
the thread is here
the thread is here
the thread is here
the thread is here
get 15m memory!!!
get more memory!!!
get 15m memory!!!
get more memory!!!
get 15m memory!!!
get 15m memory!!!
get more memory!!!
get more memory!!!
get 15m memory!!!
get more memory!!!
main exitings
用下面的命令來看linux下面的對系統的一些限制:
dongq@dongq_lap ~/workspace/test/pthread_attr $ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 16365
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
posix message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8196
cpu time (seconds, -t) unlimited
max user processes (-u) 16365
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
通過上面的命令, 我們可以清楚的看到乙個程序在正常的情況下,最大的棧空間為8m。
那麼8m我們夠用嗎?當你分配大量的static或者auto變數的時候,一般都是放在棧空間的。如果分配乙個大於8m的陣列,會發生什麼呢?
先來看看測試**:
int main()
return 0;
}上面的**直接分配乙個大小為8m的陣列,編譯後執行,出現段錯誤!!
很奇怪嗎?不是說可以分配8m嗎?怎麼不行?當然不行,因為在分配p時,棧中已經放有其它的變數,最明顯的就是int i;
這樣子的話,棧中就沒有足夠的空間給變數p分配,從而出現段錯誤。下面用gdb進行除錯:
dongq_lap pthread_attr # gdb process_stack
gnu gdb 6.5
(gdb) b main
breakpoint 1 at 0x8048392: file process_stack.c, line 13.
(gdb) r > /home/dongq/tmp/gdb.txt
starting program: /home/dongq/workspace/test/pthread_attr/process_stack > /home/dongq/tmp/gdb.txt
[thread debugging using libthread_db enabled]
[new thread -1209533760 (lwp 10947)]
[switching to thread -1209533760 (lwp 10947)]
breakpoint 1, main () at process_stack.c:13
13 {
(gdb) s
15 int i = 1024 * 1024 * 8;
(gdb) s
16 char p[ i ];
(gdb) s
17 memset( p, 0, sizeof( char ) * i );
(gdb) p p
$1 = 0xbf6c3470
(gdb) s
program received signal sigsegv, segmentation fault.
0x080483d4 in main () at process_stack.c:17
17 memset( p, 0, sizeof( char ) * i );
(gdb) bt
#0 0x080483d4 in main () at process_stack.c:17
(gdb) quit
看到了嗎?char p[i]這句執行後的結果是out of bounds!!也就是記憶體沒有分配成功。(在linux程式執行的位址空間為0x8048000-0xbfffffff)
用下面的命令改變程序棧空間:
ulimit -s 16392
重新改變程式的棧空間,很奇怪的是,有時普通使用者可以操作,有時卻出現:
dongq@dongq_lap ~/workspace/test/pthread_attr $ ulimit -s 16384
bash: ulimit: stack size: cannot modify limit: operation not permitted
改用超級許可權即可成功修改,改完之後,limit -a得到的結果中應該有下面的一行就表示成功了:
stack size (kbytes, -s) 16392
再執行上面的程式就可以正常的執行了,當然,你還可以分配更大的陣列:)
Linux之執行緒概念(pthread)
執行緒概念 1 輕量級的程序,乙個程序內部可以有多個執行緒,預設情況下乙個程序只有乙個執行緒。2 執行緒是最小的執行單元,程序是最小的系統資源分配單位。3 核心實現都是通過clone函式實現,執行緒也有自己的pcb。檢視pthread庫版本命令 getconf gnu libpthread vers...
pthread 執行緒庫
ubuntu 下沒有pthread庫 man不到相關函式 只需兩條命令搞定!sudo apt get install glibc doc sudo apt get install manpages posix dev 然後在用man k pthread create就可以找到了 pthread執行緒...
執行緒建立pthread
執行緒建立函式 int pthread create pthread t restrict tidp 指向執行緒識別符號的指標 const pthread attr t restrict attr 設定執行緒屬性 void start rtn void 執行緒執行函式的起始位址 void restr...