POSIX thread 簡稱為pthread,Posix線程是一個POSIX標准線程。該標准定義內部API創建和操縱線程。 Pthreads定義了一套 C程序語言類型、函數與常量,它以 pthread.h 頭文件和一個線程庫實現。
直接上代碼,簡單明了。
[cpp]
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
// 線程ID
pthread_t ntid;
// 互斥對象
pthread_mutex_t mutex;
int count;
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 begin\n");
// 加鎖
pthread_mutex_lock(&mutex);
printids("new thread:");
int i=0;
for ( ; i < 5; ++i )
{
printf("thr_fn runing %d\n", count++);
}
// 釋放互斥鎖
pthread_mutex_unlock(&mutex);
return ( (void*)100);
}
int main(void)
{
int err;
count = 0;
// 初始化互斥對象
pthread_mutex_init(&mutex, NULL);
// 創建線程
err = pthread_create(&ntid, NULL, thr_fn, NULL);
if ( 0 != err )
{
printf("can't create thread:%s\n", strerror(err));
}
// sleep(5);
pthread_mutex_lock(&mutex);
printids("main thread:");
int i=0;
for ( ; i < 5; ++i )
{
printf("main runing %d \n", count++);
}
sleep(1);
pthread_mutex_unlock(&mutex);
int **ret;
pthread_join(ntid, (void**)ret);
printf("thr_fn return %d\n", *ret);
pthread_mutex_destroy(&mutex);
return 0;
}
這個例子,用到了pthread的數據結構:
pthread_t, 這個結構來標識線程ID;
pthread_mutex_t, 這個用來做互斥;
用到了如下函數:
pthread_self() : 獲得線程自身的ID;
pthread_create(&ntid, NULL, thr_fn, NULL): 線程創建函數
原型:int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void*(*start_routine)(void*), void *arg)。
tid : 新創建線程的線程ID;
attr: 指定新創建線程的線程屬性,為NULL即為使用默認屬性;
start_routine : 這是一個函數指針,用來指向線程函數;
arg : 傳遞給線程函數的指針;
返回值 : 0代表成功。 失敗,返回的則是錯誤號。
pthread_join(ntid, (void*)ret):等待一個線程的結束
原型:int pthread_join(pthread_t thread, void **retval);
thread : 需要等待的線程的ID;
retval : 存放等待線程的返回值;
返回值 : 0代表成功。 失敗,返回的則是錯誤號。
pthread_mutex_init(&mutex, NULL):初始化互斥鎖,以動態方式創建互斥鎖
原型:int pthread_mutex_init(pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr);
mutex : 被初始化的鎖對象; www.2cto.com
attr : 指定新建互斥鎖的屬性。為NULL,則使用默認的互斥鎖屬性,默認屬性為快速互斥鎖。
pthread_mutex_lock(&mutex) : 加鎖
pthread_mutex_unlock(&mutex) : 釋放鎖
pthread_mutex_destroy(&mutex): 銷毀鎖對象
編譯的時候,需要加上編譯參數“-lpthread”。
可以屏蔽pthread_mutex_lock(),pthread_mutex_unlock()看下沒有互斥的結果。