Linux系統編程(2)
阿新 • • 發佈:2017-12-24
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);//不需要再次使用鎖的時候
e:env
int execle(const char *path, const char *arg,..., char * const envp[]);
環境變量指針數組:
char *envp[] = {"環境變量名=內容",NULL};
二 多線程
1.線程是進程中最小執行單元,多線程共享同一個進程的地址空間
2.Linux 內核調度的對象是線程,所以一個進程中多個線程參與操作操作系統統一調度
使用線程優點:
<1>效率高
<2>線程之間通信比較簡單(全局變量)
使用線程缺點:
安全性差
三 線程API
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)