使用gcc __cleanup__属性实现线程加锁,及自动解锁。
#include <pthread.h>
/*定义全局锁,并初始化
*@name 锁变量名
*/
#define static_mutex(name) static pthread_mutex_t name = PTHREAD_MUTEX_INITIALIZER
/*cleanup 解锁
*@mutex 锁指针的指针
*/
static inline void mutex_cleanup(pthread_mutex_t **mutex)
{
pthread_mutex_unlock(*mutex);
}
/*lock_guard对mutex进行加锁,
*退出作用域后自动调用mutex_cleanup进行解锁
*@mutex 进行加锁操作的锁变量
*/
#define lock_guard(mutex) \
pthread_mutex_lock(&mutex); \
__attribute__ ((__cleanup__(mutex_cleanup))) pthread_mutex_t *lock_ ## mutex = &mutex