1、首先,明確線程和進程的區別。什麼時候該用多線程,什麼時候該用多進程?Linux下的多線程和Win32下的有什麼區別?
2、線程基本函數,以pthread_開頭:
頭文件#include <pthread.h>
int Pthread_create(pthread_t *thread, pthread_attr_t *attr,
void* (*start_routine) (void *), void *arg);//線程創建函數
int pthread_join(pthread_t th,void **thread_return);//等待某個線程結束,第二個參數是被等待線程的返回值
int pthread_exit(pthread_t th);//退出某個線程
3、學習多線程,肯定少不了線程間的同步與互斥(也是同步的一種)
線程同步的實現機制有以下兩種:
(1)信號量機制,相應的函數以sem_開頭:
原理與操作系統中信號量機制相同,
頭文件#include <semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned int value);
int sem_wait(sem_t * sem);
int sem_post(sem_t * sem);
int sem_destroy(sem_t *sem);
(2)互斥量機制,相應的函數有:
與信號量的函數非常相似
頭文件#include <pthread.h>
int pthread_mutex_int(pthread_mutex_t *mutex,const pyhread_mutexattr_t *mutexattr);
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
4、線程的屬性pthread_attr_t(在線程創建函數裏有這個結構屬性)
最重要的函數:int pthread_attr_int(pthread_attr_t * attr);
初始化一個線程屬性對象後,可以調用其他的函數設置不同的屬性行爲,這些函數_set以屬性指針和一個狀態爲形參 ;_get以屬性指針和一個狀態指針爲形參:
(1)detachedstate:是否對線程進行重新組合,與pthead_join()有關。默認PTHREAD_CREATE_JOINABLE, PTHREAD_CREATE_DETACHED設置脫離狀態,可以允許被創建的線程獨立的完成工作,而無需原先的線程等待它。
(2)schedulepolicy:線程調度方式,默認SCHED_OTHER,另外兩種只能用於超級用戶權限運行。
(3)scheduleparam:與上邊屬性結合使用。
(4)inheritsched、scope、stacksize目前用到很少。
5、取消線程
#include <pthread.h>
int pthread_cancel(pthread_t thread);//一個線程可以要求另一個線程終止,就像發送信號一樣
int pthread_setcancelstate(int state,int *oldstate);//接收方設置自己的取消狀態
其中,state:PTHREAD_CANCEL_ENABLE(接受取消請求)和PTHREAD_CANCEL_DISABLE(忽略取消請求)。
int pthread_setcanceltype(int type, int *oldtype);//如果取消請求被接受了,進入第二個控制層次設置取消類型
其中,type:PTHREAD_CANCEL_ASYNCHRONOUS(接收到取消請求後立即採取行動)PTHREAD_CANCEL_DEFERRED(接收到取消請求一直到線程執行了下述函數後在採取行動:pthread_join,sem_wait,phread_cond_wait,pthread_cond_timewait,
sig_wait)。