pthread_mutex.h頭文件
#ifndef __SEM_UTIL_H__ #define __SEM_UTIL_H__ typedef void* SemHandl_t; SemHandl_t MakeSem(); ///< Initialize the semaphore. int SemRelease(SemHandl_t hndlSem); ///< Unlock the semaphore. int SemWait(SemHandl_t hndlSem); ///< Lock the semaphore. int DestroySem(SemHandl_t hndlSem); ///< Destory the semaphore. #endif
pthread_mutex.c源文件
/* 互斥鎖用來保證一段時間內只有一個線程在執行一段代碼。 必要性顯而易見:假設各個線程向同一個文件順序寫入數據, 最後得到的結果一定是災難性的。 */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> #include "pthread_mutex.h" #define __DEBUG #ifdef __DEBUG #define DBG(fmt,args...) fprintf(stdout, fmt, ##args) #else #define DBG(fmt,args...) #endif #define ERR(fmt,args...) fprintf(stderr, fmt, ##args) /*線程互斥鎖初始化*/ SemHandl_t MakeSem() { SemHandl_t hndlSem = malloc(sizeof(pthread_mutex_t)); if(hndlSem == NULL){ ERR("Not enough memory!!\n"); return NULL; } /* Initialize the mutex which protects the global data */ if(pthread_mutex_init(hndlSem, NULL) != 0){ ERR("Sem init faill!!\n"); free(hndlSem); return NULL; } return hndlSem; } /*線程互斥鎖釋放*/ int SemRelease(SemHandl_t hndlSem) { if(hndlSem == NULL){ ERR("SemRelease: Invalid Semaphore handler\n"); return -1; } return pthread_mutex_unlock(hndlSem); } /*等待*/ int SemWait(SemHandl_t hndlSem) { if(hndlSem == NULL){ ERR("SemWait: Invalid Semaphore handler\n"); return -1; } return pthread_mutex_lock(hndlSem); } /*刪除*/ int DestroySem(SemHandl_t hndlSem) { if(hndlSem == NULL){ ERR("DestroySem: Invalid Semaphore handler\n"); return -1; } pthread_mutex_lock(hndlSem); pthread_mutex_unlock(hndlSem); if(pthread_mutex_destroy(hndlSem) !=0){ ERR("Sem_kill faill!!\n"); } free(hndlSem); return 0; }