Loading

10.并发下锁操作及原子操作

图解

代码

#define _GNU_SOURCE  // 启用GNU扩展以包含自旋锁定义
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>



#define THREAD_COUNT     10

pthread_mutex_t mutex;
pthread_spinlock_t spinlock;


int inc(int *value, int add) {
    int old;

    __asm__ volatile(
        "lock; xaddl %2, %1;"
        : "=a" (old)
        : "m" (*value), "a"(add)
        : "cc", "memory"
    );

    return old;
}



void *thread_callback(void *arg) {

    int *pcount = (int*) arg;
    int i = 0;
    while (i++ < 100000) {
#if 0
        (*pcount)++;
#elif 0
        pthread_mutex_lock(&mutex);
        (*pcount)++;
        pthread_mutex_unlock(&mutex);
#elif 0
        pthread_spin_lock(&spinlock);
        (*pcount)++;
        pthread_spin_unlock(&spinlock);
#else
        inc(pcount, 1);
#endif
        usleep(1);
    }
    
}




int main() {

    pthread_t threadid[THREAD_COUNT] = {0};

    pthread_mutex_init(&mutex, NULL);
    pthread_spin_init(&spinlock, PTHREAD_PROCESS_SHARED);

    int i = 0;
    int count = 0;
    for (i = 0; i < THREAD_COUNT; i++) {
        pthread_create(&threadid[i], NULL, thread_callback, &count);
    }

    for (i = 0; i < 100; i++) {
        printf("count : %d\n", count);
        sleep(1);
    }

}

编译

gcc -o lock lock.c -lpthread
posted @ 2025-02-09 10:09  lotuslaw  阅读(13)  评论(0)    收藏  举报