使用 原子操作 __sync_val_compare_and_swap进行无锁化编程

        动态库中对外提供一个接口,查询某个状态,查询接口返回值为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;
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用__sync_val_compare_and_swap()函数的示例: ``` #include <stdio.h> #include <stdlib.h> #include <pthread.h> #define THREADS 4 #define LOOP 1000000 int counter = 0; void *increment(void *arg) { int i; int local_counter = 0; for (i = 0; i < LOOP; i++) { int old_value = counter; int new_value = old_value + 1; while (__sync_val_compare_and_swap(&counter, old_value, new_value) != old_value) { old_value = counter; new_value = old_value + 1; } local_counter++; } printf("Thread %ld incremented counter %d times\n", (long)arg, local_counter); pthread_exit(NULL); } int main(void) { pthread_t threads[THREADS]; int i; for (i = 0; i < THREADS; i++) { if (pthread_create(&threads[i], NULL, increment, (void *)(long)i)) { fprintf(stderr, "Error creating thread\n"); exit(1); } } for (i = 0; i < THREADS; i++) { if (pthread_join(threads[i], NULL)) { fprintf(stderr, "Error joining thread\n"); exit(1); } } printf("Counter value: %d\n", counter); return 0; } ``` 这个程序创建了4个线程,每个线程执行1000000次循环。在每次循环中,线程将计数器的旧值存储在一个变量中,然后将计数器的值增加1。如果__sync_val_compare_and_swap()函数返回了旧值,说明另一个线程已经更新了计数器,这个线程需要重试。如果函数返回了新值,说明这个线程成功更新了计数器的值。 这个程序使用了__sync_val_compare_and_swap()函数来保证计数器的并发更新是正确的。这个函数可以原子地读取、比较和更新一个变量的值,它可以确保线程之间的同步,并避免竞态条件的出现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值