| 当前读写锁的状态 | 线程发出“读”请求 | 线程发出“写”请求 |
|---|---|---|
| 无锁 | 允许占用 | 允许占用 |
| 读锁 | 允许占用 | 阻塞线程执行 |
| 写锁 | 阻塞线程执行 | 阻塞线程执行 |
<pthread.h>头文件中。举个例子:
pthread_rwlock_t myRWLock;由此,我们就成功创建了一个读写锁。但要想使用 myRWLock 读写锁,还需要进行初始化操作。
pthread_rwlock_t myRWLock = PTHREAD_RWLOCK_INITIALIZER;还可以借助 pthread_rwlock_init() 函数初始化读写锁,此函数的语法格式为:
int pthread_rwlock_init(pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr);rwlock 参数用于指定要初始化的读写锁变量;attr 参数用于自定义读写锁变量的属性,置为 NULL 时表示以默认属性初始化读写锁。
当 attr 参数为 NULL 时,以上两种初始化方式完全等价。
int pthread_rwlock_rdlock(pthread_rwlock_t* rwlock); int pthread_rwlock_tryrdlock(pthread_rwlock_t* rwlock);其中,rwlock 参数指的是初始化好的读写锁。
int pthread_rwlock_wrlock(pthread_rwlock_t* rwlock); int pthread_rwlock_trywrlock(pthread_rwlock_t* rwlock);rwlock 参数指的是初始化好的读写锁。
int pthread_rwlock_unlock (pthread_rwlock_t* rwlock);rwlock 参数表示要释放的读写锁。
int pthread_rwlock_destroy(pthread_rwlock_t* rwlock);参数 rwlock 表示要销毁的目标读写锁。
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
int x = 0;
//创建读写锁变量
pthread_rwlock_t myrwlock;
void* read_thread(void* args){
printf("------%u read_thread ready\n",pthread_self());
while (1)
{
sleep(1);
//请求读锁
pthread_rwlock_rdlock(&myrwlock);
printf("read_thread: %u,x=%d\n", pthread_self(), x);
sleep(1);
//释放读写锁
pthread_rwlock_unlock(&myrwlock);
}
return NULL;
}
void* write_thread(void* param)
{
printf("------%u write_thread ready!\n",pthread_self());
while (1)
{
sleep(1);
// 请求写锁
pthread_rwlock_wrlock(&myrwlock);
++x;
printf("write_thread: %u,x=%d\n", pthread_self(), x);
sleep(1);
//释放读写锁
pthread_rwlock_unlock(&myrwlock);
}
return NULL;
}
int main()
{
int i;
//初始化读写锁
pthread_rwlock_init(&myrwlock, NULL);
//创建 3 个读 x 变量的线程
pthread_t readThread[3];
for (i = 0; i < 3; ++i)
{
pthread_create(&readThread[i], NULL, read_thread, NULL);
}
//创建 1 个修改 x 变量的线程
pthread_t writeThread;
pthread_create(&writeThread, NULL, write_thread, NULL);
//等待各个线程执行完成
pthread_join(writeThread, NULL);
for (int i = 0; i < 3; ++i)
{
pthread_join(readThread[i], NULL);
}
//销毁读写锁
pthread_rwlock_destroy(&myrwlock);
return 0;
}
假设程序编写在 thread.c 文件中,执行过程如下:
[root@localhost ~]# gcc thread.c -o thread.exe -lpthread [root@localhost ~]# ./mythread.exe ------1134741248 read_thread ready ------1113761536 read_thread ready ------1103271680 write_thread ready! ------1124251392 read_thread ready read_thread: 1124251392,x=0 read_thread: 1113761536,x=0 read_thread: 1134741248,x=0 write_thread: 1103271680,x=1 read_thread: 1134741248,x=1 read_thread: 1124251392,x=1 read_thread: 1113761536,x=1 write_thread: 1103271680,x=2 read_thread: 1124251392,x=2 read_thread: 1113761536,x=2 read_thread: 1134741248,x=2
程序中共创建了 4 个子线程,其中 3 个线程用于读取 x 变量的值,读取变量前会先获得“读锁”。剩余的 1 个线程用于修改 x 变量的值,修改前先获得“写锁”。注意,此程序会一直执行,按 "Ctrl+Z" 组合键可以使程序停止。
除了读写锁,线程同步的实现方式还有互斥锁、信号量以及条件变量。
版权说明:Copyright © 广州松河信息科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州松河信息科技有限公司 版权所有