pthread_create函式的詳細講解(包括向執行緒函式傳遞引數詳解)
阿新 • • 發佈:2019-02-13
pthread_create是UNIX環境建立執行緒函式
linux下用C開發多執行緒程式,Linux系統下的多執行緒遵循POSIX執行緒介面,稱為pthread。
由 restrict 修飾的指標是最初唯一對指標所指向的物件進行存取的方法,僅當第二個指標基於第一個時,才能對物件進行存取。對物件的存取都限定於基於由 restrict 修飾的指標表示式中。 由 restrict 修飾的指標主要用於函式形參,或指向由 malloc() 分配的記憶體空間。restrict 資料型別不改變程式的語義。 編譯器能通過作出
restrict 修飾的指標是存取物件的唯一方法的假設,更好地優化某些型別的例程。
的指標。
第二個引數用來設定執行緒屬性。
第三個引數是執行緒執行函式的起始地址。
最後一個引數是執行函式的引數。
另外,在編譯時注意加上-lpthread引數,以呼叫靜態連結庫。因為pthread並非Linux系統的預設庫
void printids(const char *s)
{
pid_t pid;
pthread_t tid;
pid = getpid();
tid = pthread_self();
printf("%s pid %u tid %u (0x%x)\n", s,
(unsigned int)pid, (unsigned int)tid, (unsigned int)tid);
} void *thr_fn(void *arg)
{
printids("new thread: ");
return((void *)0);
}
int main(void)
{
int err;
err = pthread_create(&ntid, NULL, thr_fn, NULL);
if (err != 0)
printf("can't create thread: %s\n", strerror(err));
printids("main thread:");
sleep(1);
exit(0);
}
$ gcc main.c -lpthread
標頭檔案
#include<pthread.h>函式宣告
int pthread_create(pthread_t*restrict tidp,const pthread_attr_t *restrict_attr,void*(*start_rtn)(void*),void *restrict arg);返回值
若成功則返回0,否則返回出錯編號 返回成功時,由tidp指向的記憶體單元被設定為新建立執行緒的執行緒ID。attr引數用於制定各種不同的執行緒屬性。新建立的執行緒從start_rtn函式的地址開始執行,該函式只有一個萬能指標引數arg,如果需要向start_rtn函式傳遞的引數不止一個,那麼需要把這些引數放到一個結構中,然後把這個結構的地址作為arg的引數傳入。引數
第一個引數為指向執行緒識別符號示例
列印執行緒 IDs #include <pthread.h> #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <string.h> pthread_t ntid;$ ./a.out
向執行緒函式傳遞引數詳解:
向執行緒函式傳遞引數分為兩種:
(1)執行緒函式只有一個引數的情況:直接定義一個變數通過應用傳給執行緒函式。
例子:
#include <iostream>
#include <pthread.h>
using namespace std;
pthread_t thread;
void fn(void *arg)
{
int i = *(int *)arg;
cout<<"i = "<<i<<endl;
return ((void *)0);
}
int main()
{
int err1;
int i=10;
err1 = pthread_create(&thread, NULL, fn, &i);
pthread_join(thread, NULL);
}
2、執行緒函式有多個引數的情況:這種情況就必須申明一個結構體來包含所有的引數,然後在傳入執行緒函式,具體如下:
例子:
首先定義一個結構體:
struct parameter
{
int size,
int count;
。。。。。
。。。
};
然後在main函式將這個結構體指標,作為void *形參的實際引數傳遞
struct parameter arg;
通過如下的方式來呼叫函式:
void fn(void *arg)
{
int i = *(int *)arg;
cout<<"i = "<<i<<endl;
return ((void *)0);
}