1. 程式人生 > >黑馬《linux系統程式設計》學習筆記(從66到70)

黑馬《linux系統程式設計》學習筆記(從66到70)

六十六. 執行緒的概念

 

 所以執行緒之間通訊,不可以用區域性變數(因為區域性變數在棧裡)

這裡的命令可以知道,各部分大小

[[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;
}