linux系统编程:线程同步-读写锁(rwlock)

线程同步-读写锁(rwlock)

读写锁

读写锁是互斥量的细化:显然,只有对全局资然进行写入操作时,才需要同步;在对全局资然进行读取操作时,是不需要锁的。

相关函数

pthread_rwlock_t    //读写锁类型
pthread_rwlock_init //初始化
pthread_rwlock_destroy  //销毁锁
pthread_rwlock_rdlock   //获取读锁
pthread_rwlock_wrlock   //获取写锁
pthread_rwlock_tryrdlock
pthread_rwlock_trywrlock
pthread_rwlock_unlock   //释放读写锁

示例

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
pthread_rwlock_t rwlock;
int counter = 0;
void *fun_r(void *argv)
{
	while (1)
	{
		//既然是读操作,当然可以完全不用锁
		pthread_rwlock_rdlock(&rwlock);
		printf("thread %x read,counter=%d\n", pthread_self(), counter);
		pthread_rwlock_unlock(&rwlock);
		sleep(1);
	}
}
void *fun_w(void *argv)
{
	while (1)
	{
		//写操作,写操作使用写锁
		pthread_rwlock_wrlock(&rwlock);
		counter++;
		printf("thread %x write,counter=%d\n", pthread_self(), counter);
		pthread_rwlock_unlock(&rwlock);
		sleep(1);
	}
}
int main(void)
{
	pthread_rwlock_init(&rwlock, NULL);
	pthread_t tid[5];
	int i;
	//开启2个线程读
	for (i = 0; i < 2; i++)
	{
		pthread_create(&tid[i], NULL, fun_r, NULL);
	}
	//开启3个线程写
	for (i = 2; i < 5; i++)
	{
		pthread_create(&tid[i], NULL, fun_w, NULL);
	}
	for (i = 0; i < 5; i++)
	{
		pthread_join(tid[i], NULL);
	}
	pthread_rwlock_destroy(&rwlock);
	return 0;
}

CCPP Blog 目录

版权声明:本文为博主原创文章,转载,请注明出处。

时间: 2024-12-22 06:00:29

linux系统编程:线程同步-读写锁(rwlock)的相关文章

Linux系统编程——线程同步与互斥:读写锁

当有一个线程已经持有互斥锁时,互斥锁将所有试图进入临界区的线程都阻塞住.但是考虑一种情形,当前持有互斥锁的线程只是要读访问共享资源,而同时有其它几个线程也想读取这个共享资源,但是由于互斥锁的排它性,所有其它线程都无法获取锁,也就无法读访问共享资源了,但是实际上多个线程同时读访问共享资源并不会导致问题. 在对数据的读写操作中,更多的是读操作,写操作较少,例如对数据库数据的读写应用.为了满足当前能够允许多个读出,但只允许一个写入的需求,线程提供了读写锁来实现.... www.worlduc.com/

linux系统编程--线程同步

同步概念 所谓同步,即同时起步,协调一致.不同的对象,对“同步”的理解方式略有不同. 如,设备同步,是指在两个设备之间规定一个共同的时间参考: 数据库同步,是指让两个或多个数据库内容保持一致,或者按需要部分保持一致: 文件同步,是指让两个或多个文件夹里的文件保持一致.等等 而,编程中.通信中所说的同步与生活中大家印象中的同步概念略有差异.“同”字应是指协同.协助.互相配合.主旨在协同步调,按预定的先后次序运行. 线程同步 同步即协同步调,按预定的先后次序运行. 线程同步,指一个线程发出某一功能调

Linux系统编程——线程同步与互斥:无名信号量

信号量概述 信号量广泛用于进程或线程间的同步和互斥,信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问. 编程时可根据操作信号量值的结果判断是否对公共资源具有访问的权限,当信号量值大于 0 时,则可以访问,否则将阻塞.PV 原语是对信号量的操作,一次 P 操作使信号量减1,一次 V 操作使信号量加1. 信号量主要用于进程或线程间的同步和互斥这两种典型情况. 信号量用于互斥: 信号量用于同步: 在 POSIX 标准中,信号量分两种,一种是无名信号量,一种是有名信号量.无名信号量一般用

Linux系统编程——线程同步与互斥:互斥锁

为什么需要互斥锁? 在多任务操作系统中,同时运行的多个任务可能都需要使用同一种资源.这个过程有点类似于,公司部门里,我在使用着打印机打印东西的同时(还没有打印完),别人刚好也在此刻使用打印机打印东西,如果不做任何处理的话,打印出来的东西肯定是错乱的. 下面我们用程序模拟一下这个过程,线程一需要打印" hello ",线程二需要打印" world ",不加任何处理的话,打印出来的内容会错乱: #include <stdio.h> #include <

linux网络编程-----&gt;线程同步一

开发使用多线程过程中, 不可避免的会出现多个线程同时操作同一块共享资源, 当操作全部为读时, 不会出现未知结果, 一旦当某个线程操作中有写操作时, 就会出现数据不同步的事件. 而出现数据混乱的原因: 资源共享(独享资源则不会) 调试随机(对数据的访问会出现竞争) 线程间缺少必要的同步机制 以上三点, 前两点不能被改变. 欲提高效率, 传递数据, 资源必须共享. 只要资源共享, 就一定会出现线程间资源竞争, 只要存在竞争关系, 数据就会出现混乱. 所以只能从第三点着手, 使多个线程在访问共享资源的

线程同步——读写锁

读写锁 读写锁与互斥量类似.也是通过加锁的方式来实现线程之间的数据同步.互斥量的特点是 一次只有一个线程对其加锁.而对于度操作来说,即使有多个线程同时进行读操作是不会 产生冲突的.读写锁便利用了这个特性.它一共有三个状态:读模式下加锁状态,写模式 下加锁状态和不加锁状态.使用的规则如下: 当读写锁是写加锁状态时,在这个锁被解锁之前,所有试图对这个锁加锁的线程都会被阻塞.但是以读方式枷锁的线程是可以操作共享数据的. 当读写锁是读加锁状态时,所有试图以读模式对它进行加锁的线程都可以得到访问权限但是如

linux网络编程-----&gt;线程同步--&gt;信号量

开发使用多线程过程中, 不可避免的会出现多个线程同时操作同一块共享资源, 当操作全部为读时, 不会出现未知结果, 一旦当某个线程操作中有写操作时, 就会出现数据不同步的事件. 而出现数据混乱的原因: 资源共享(独享资源则不会) 调试随机(对数据的访问会出现竞争) 线程间缺少必要的同步机制 以上三点, 前两点不能被改变. 欲提高效率, 传递数据, 资源必须共享. 只要资源共享, 就一定会出现线程间资源竞争, 只要存在竞争关系, 数据就会出现混乱. 所以只能从第三点着手, 使多个线程在访问共享资源的

linux网络编程-----&gt;线程同步--&gt;条件变量

开发使用多线程过程中, 不可避免的会出现多个线程同时操作同一块共享资源, 当操作全部为读时, 不会出现未知结果, 一旦当某个线程操作中有写操作时, 就会出现数据不同步的事件. 而出现数据混乱的原因: 资源共享(独享资源则不会) 调试随机(对数据的访问会出现竞争) 线程间缺少必要的同步机制 以上三点, 前两点不能被改变. 欲提高效率, 传递数据, 资源必须共享. 只要资源共享, 就一定会出现线程间资源竞争, 只要存在竞争关系, 数据就会出现混乱. 所以只能从第三点着手, 使多个线程在访问共享资源的

Linux系统编程——线程私有数据

在多线程程序中,经常要用全局变量来实现多个函数间的数据共享.由于数据空间是共享的,因此全局变量也为所有线程共有. 测试代码如下: #include <stdio.h> #include <pthread.h> #include <unistd.h> #include <stdlib.h> int key = 100; //全局变量 void *helloworld_one(void *arg) { printf("the message is %s