测试多核同步性能开销时,使用了sysbench来进行互斥锁开销测试。下面是互斥锁开销测试的核心代码。https://github.com/akopytov/sysbench/blob/master/src/tests/mutex/sb_mutex.c
sb_event_t mutex_next_event(int thread_id)
{
sb_event_t sb_req;
sb_mutex_request_t *mutex_req = &sb_req.u.mutex_request;
(void) thread_id; /* unused */
/* Perform only one request per thread */
if (tls_counter++ > 0)
sb_req.type = SB_REQ_TYPE_NULL;
else
{
sb_req.type = SB_REQ_TYPE_MUTEX;
mutex_req->nlocks = mutex_locks;
mutex_req->nloops = mutex_loops;
}
return sb_req;
}
int mutex_execute_event(sb_event_t *sb_req, int thread_id)
{
unsigned int i;
unsigned int current_lock;
sb_mutex_request_t *mutex_req = &sb_req->u.mutex_request;
(void) thread_id; /* unused */
do
{
current_lock = sb_rand_uniform(0, mutex_num - 1); //互斥锁的个数
for (i = 0; i < mutex_req->nloops; i++) //获得锁之前空循环的个数-模拟线程获得锁之前
//的执行动作。
ck_pr_barrier();
pthread_mutex_lock(&thread_locks[current_lock].mutex);
global_var++;
pthread_mutex_unlock(&thread_locks[current_lock].mutex);
mutex_req->nlocks--;
}
while (mutex_req->nlocks > 0); //每个线程需要获得多少次锁
return 0;
}