黑馬《linux系統程式設計》學習筆記(從66到70)
阿新 • • 發佈:2019-01-01
六十六. 執行緒的概念
所以執行緒之間通訊,不可以用區域性變數(因為區域性變數在棧裡)
這裡的命令可以知道,各部分大小
[[email protected]_0_15_centos ~]# 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) 7283 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 100001 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 7283 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
六十七. pthread_create執行緒建立函式
arg是執行緒處理函式的引數的內容
寫一個pthread_create.c
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <string.h> #include <pthread.h> //這裡是執行緒對應的標頭檔案 void* myfunc(void* arg) { printf("child pthread id: %lu\n", pthread_self()); return NULL; } int main(int argc, const char* argv[]) { // 建立子執行緒 pthread_t thid; // 返回錯誤號 int ret = pthread_create(&thid, NULL, myfunc, NULL); if(ret != 0) { printf("error number: %d\n", ret); // 根據錯誤號列印錯誤資訊 printf("error information: %s\n", strerror(ret)); } printf("parent pthread id: %lu\n", pthread_self()); //這裡sleep是因為,父執行緒和子執行緒也會競爭cpu。 //如果父執行緒先結束,那麼則整個程式釋放,子執行緒來不及執行,就結束了 sleep(1); return 0; }
執行一下
[[email protected]_0_15_centos 8Day]# gcc pthread_create.c -lpthread
[[email protected]_0_15_centos 8Day]# ls
a.out process_r.c pthread_create.c pthread_uncle.c
deamon.c process_work.c pthread_exit.c setsid.c
loop_pthread_create.c pthread_attr.c pthread_join.c
[ [email protected]_0_15_centos 8Day]# ./a.out
parent pthread id: 140423590418240
child pthread id: 140423582037760
六十八. 迴圈建立多個子執行緒和注意事項
這裡寫一個loop_pthread_create.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <pthread.h>
void* myfunc(void* arg)
{
// int num = *(int*)arg;
int num = (int)arg;
printf("%dth child pthread id: %lu\n", num, pthread_self());
return NULL;
}
int main(int argc, const char* argv[])
{
// 建立子執行緒
pthread_t thid[5];
// 返回錯誤號
for(int i=0; i<5; ++i)
{
//int ret = pthread_create(&thid[i], NULL, myfunc, (void*)&i);
int ret = pthread_create(&thid[i], NULL, myfunc, (void*)i);
if(ret != 0)
{
printf("error number: %d\n", ret);
// 根據錯誤號列印錯誤資訊
printf("error information: %s\n", strerror(ret));
}
}
printf("parent pthread id: %lu\n", pthread_self());
sleep(1);
return 0;
}
如果程式裡,在pthread_create那裡第4個引數,是(void*)&i,那麼將會導致問題,原因是
所以那裡需要改為傳值。
執行結果
六十九. 複習
七十. 執行緒函式列印錯誤資訊
這裡寫一個pthread_create.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <pthread.h> //這裡是執行緒對應的標頭檔案
void* myfunc(void* arg)
{
//取資料
int num = *(int*)arg;
//列印子程序的id
printf("child pthread id: %lu\n", pthread_self());
return NULL;
}
int main(int argc, const char* argv[])
{
// 建立子執行緒
//執行緒ID變數
int ret = pthread_create(&thid[i], NULL, myfunc, (void*)&i);
if(ret != 0)
{
printf("error number: %d\n",ret);
//列印錯誤資訊
printf("%s\n",strerror(ret));
}
printf("parent pthread id: %lu\n", pthread_self());
//這裡sleep是因為,父執行緒和子執行緒也會競爭cpu。
//如果父執行緒先結束,那麼則整個程式釋放,子執行緒來不及執行,就結束了
sleep(1);
return 0;
}