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;
}