1. 程式人生 > >Linux系統編程(2)

Linux系統編程(2)

linux系統編程

一 exec函數

e:env
int execle(const char *path, const char *arg,..., char * const envp[]);

環境變量指針數組:
char *envp[] = {"環境變量名=內容",NULL};

二 多線程

1.線程是進程中最小執行單元,多線程共享同一個進程的地址空間
2.Linux 內核調度的對象是線程,所以一個進程中多個線程參與操作操作系統統一調度

使用線程優點:
<1>效率高
<2>線程之間通信比較簡單(全局變量)

使用線程缺點:
安全性差

三 線程API

1.線程創建
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);

參數:
@thread 獲取線程ID
@attr 設置線程屬性 NULL:默認屬性
@start_routine 線程執行的函數
@arg 給線程執行函數傳遞的參數

返回值:
成功返回0, 失敗返回錯誤碼

練習:
創建兩個子線程,子1線程輸出data值,子2線程data ++操作,主線程將data -- 操作 (data 在主線程定義)

2.線程退出

(1)線程函數返回 (return)
(2)pthread_exit
(3)pthread_cancel
(4)進程結束,這個進程中所有的線程都退出

void pthread_exit(void *retval);
功能:用來退出一個線程
參數:
@retval 返回一個地址值


int pthread_join(pthread_t thread, void **retval);
功能:等待一個線程退出,將退出線程未釋放的資源釋放掉
參數:
@thread 需要等待退出線程的ID
@retval 獲得線程退出返回的值


void *thread_function(void *arg)
{
int data = 100;

pthread_exit(&data);
}

int main()
{
int *p;

pthread_join(tid,&p);
return 0;
}

3.將線程標記分離

分離狀態的線程在結束的時候,系統自動回收它的資源

int pthread_detach(pthread_t thread);
@thread 線程ID


三 線程互斥鎖

功能:對共享資源實現互斥訪問,保證訪問的完整性

如果使用互斥鎖,每個線程在訪問共享資源,都必須先獲得互斥鎖,然後在訪問共享資源,如果無法獲得互斥鎖
,則表示有其他線程正在訪問共享資源,此時沒有獲得鎖的線程會阻塞,直到其他線程釋放鎖,能再次獲得鎖

1.定義互斥鎖[全局,讓每個線程都可以訪問到]
pthread_mutex_t lock;

2.初始化互斥鎖

//[線程創建之前]動態初始化,屬性使用默認 NULL
int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);

//靜態初始化定義初始化
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

3.獲得互斥鎖
int pthread_mutex_lock(pthread_mutex_t *mutex);//操作共享資源之前加鎖
int pthread_mutex_trylock(pthread_mutex_t *mutex);

4.釋放鎖
int pthread_mutex_unlock(pthread_mutex_t *mutex);//操作共享資源結束的時候

5.銷毀鎖
int pthread_mutex_destroy(pthread_mutex_t *mutex);//不需要再次使用鎖的時候


Linux系統編程(2)