C语言下面的一个多线程读锁例子
这是一个C语言多线程读写锁的例子。
创建了10个线程,线程对一个全局变量做自减操作。减到0之后线程退出。
每个自减线程里面添加了 写锁,避免了数据竞争的情况。
#include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <stdint.h> #include <stddef.h> #define THREAD_COUNT 10 // 全局变量 int iCount = 100; pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER; // 线程函数 void *decrementThread(void *arg) { int threadId = *((int *)arg); while (1) { // 加写锁 pthread_rwlock_wrlock(&rwlock); if (iCount > 0) { iCount--; printf("Thread %d: iCount = %d\n", threadId, iCount); } // 解写锁 pthread_rwlock_unlock(&rwlock); // 判断是否终止 if (iCount <= 0) { break; } } return NULL; } int main() { pthread_t threads[THREAD_COUNT]; int threadIds[THREAD_COUNT]; // 初始化读写锁 if (pthread_rwlock_init(&rwlock, NULL) != 0) { perror("Failed to initialize rwlock"); exit(EXIT_FAILURE); } // 创建并启动线程 for (int i = 0; i < THREAD_COUNT; i++) { threadIds[i] = i + 1; if (pthread_create(&threads[i], NULL, decrementThread, (void *)&threadIds[i]) != 0) { perror("Failed to create thread"); exit(EXIT_FAILURE); } } // 等待所有线程结束 for (int i = 0; i < THREAD_COUNT; i++) { if (pthread_join(threads[i], NULL) != 0) { perror("Failed to join thread"); exit(EXIT_FAILURE); } } // 销毁读写锁 pthread_rwlock_destroy(&rwlock); // 打印最终结果 printf("Final iCount = %d\n", iCount); return 0; } // gcc program.c -o program.bin -pthread
读写锁需要包含头文件 #include <pthread.h>
读写锁的api总结如下:
// 读写锁初始化 pthread_rwlock_init(&m_lock, nullptr); // 销毁读写锁 pthread_rwlock_destroy(&m_lock); // 读锁 锁定 pthread_rwlock_rdlock(&m_lock); // 写锁 锁定 pthread_rwlock_wrlock(&m_lock); // 解锁 pthread_rwlock_unlock(&m_lock);
注意,这里只是介绍读写锁的api,以及用一个示例来解释基本用法。这个还不能直接用于生成环境。
因为存在一个 多次释放锁 的问题。
如果要在生成环境使用,还需要定义一个 bool m_locked; 变量。
加锁,解锁的时候,都要判断这里的 m_locked变量的值。避免重复释放,或者重复加锁。