动态库中对外提供一个接口,查询某个状态,查询接口返回值为unsigned char类型,该值为一全局变量,会频繁变更,所以为防止用户在获取的时候不准确,所以在使用到该变量的时候都加上了互斥锁。
代码如下:
static BYTE g_status = 0;
void set_status(BYTE stat)
{
LOCKWAIT(casLock_umfState);
g_status = stat;
UNLOCK(casLock_umfState);
}
//用户会多线程一秒调用上万次
BYTE get_status()
{
LOCKWAIT(casLock_umfState);
BYTE stat = g_status;
UNLOCK(casLock_umfState);
return stat;
}
由于锁的存在会导致用户线程之间产生互斥等待,影响进程的性能,所以在这里使用互斥锁是不合理的。
互斥锁锁的变量是一个unsigned char类型的值,因此很容易想到用原子操作替代锁来提升接口的并发效率。更改后如下:
static BYTE g_status = 0;
void set_status(BYTE stat)
{
//LOCKWAIT(casLock_umfState);
__sync_val_compare_and_swap(&g_status,g_status,stat);
//UNLOCK(casLock_umfState);
}
//用户会多线程一秒调用上万次
BYTE get_status()
{
//LOCKWAIT(casLock_umfState);
//BYTE stat = g_status;
//UNLOCK(casLock_umfState);
return g_status;
}