線程的互斥鎖

[頭文件]
#include <pthread.h>

[注意]
互斥鎖是非異步安全,也就是說在信號處理中使用互斥鎖容易造成死鎖

[創建]

/*
 * @brief   靜態創建並初始化互斥鎖
 * @param[in]  PTHREAD_MUTEX_INITIALIZER 互斥鎖結構常量
 */    
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

/*
 * @brief   初始化互斥鎖
 * @param[in|out] mutex      互斥鎖
 * @param[in]  attr      互斥鎖屬性
 *     @NULL      默認屬性
 * @return   初始化結果     
 *     @li 0      初始化成功
 *     @li !0      標準錯誤碼
 */  
int pthread_mutex_init(pthread_mutex_t * mutex, const pthread_mutexattr_t * attr);

[操作]
/*
 * @brief   加鎖
 * @param[in|out] mutex      互斥鎖
 * @return   結果     
 *     @li 0      成功
 *     @li !0      標準錯誤碼
 */ 
int pthread_mutex_lock(pthread_mutex_t *mutex);

/*
 * @brief   嘗試加鎖
 * @param[in|out] mutex      互斥鎖
 * @return   結果     
 *     @li 0      成功
 *     @li !0      標準錯誤碼
 */ 
int pthread_mutex_trylock(pthread_mutex_t *mutex);

/*
 * @brief   解鎖
 * @param[in|out] mutex      互斥鎖
 * @return   結果     
 *     @li 0      成功
 *     @li !0      標準錯誤碼
 */ 
int pthread_mutex_unlock(pthread_mutex_t *mutex);

[銷燬]
/*
 * @brief   釋放互斥鎖佔用的所有資源
 * @param[in|out] mutex      互斥鎖
 * @return   結果     
 *     @li 0      成功
 *     @li !0      標準錯誤碼
 * @notes   銷燬的時候,鎖必須處於釋放狀態
 */ 
int pthread_mutex_destroy(pthread_mutex_t *mutex);

 

例子:

#include <stdio.h>
#include <pthread.h>

pthread_mutex_t mutex;

void *thread(void *arg)
{
 int i = 0;
 
 sleep(1);
 pthread_mutex_lock(&mutex);
 while (i++ < 5)
 {
  printf("this is thread!\n");
  sleep(1);
 }
 pthread_mutex_unlock(&mutex);
  
 return (void *)0;
}

int main(int argc, char **argv)
{
 pthread_t id;
 void *ret;
 int i = 0;
 
 pthread_create(&id, NULL, thread, NULL);
 pthread_mutex_init(&mutex, NULL);
 sleep(3);
 
 pthread_mutex_lock(&mutex);
 while (i++ < 5)
 {
  printf("this is main!\n");
  sleep(1);
 }
 pthread_mutex_unlock(&mutex);
 
 pthread_join(id, &ret);
 
 return 0;
}

 

注意:編譯時加上-lpthread,否則編譯不過

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章