当前位置: 首页 > news >正文

小程序免费制作平台二维码筛选网站推广和优化系统

小程序免费制作平台二维码筛选,网站推广和优化系统,国税网站上如何做股权变更,网络优化工程师是干嘛的1.背景概念 在编写多线程的时候,有一种情况是十分常见的。那就是,有些公共数据修改的机会比较少。相比较改写,它们读的机会反而高的多。这样就衍生出了读者写者模型,在这个模型中,有两类线程:读者和写者。读…

1.背景概念

在编写多线程的时候,有一种情况是十分常见的。那就是,有些公共数据修改的机会比较少。相比较改写,它们读的机会反而高的多。这样就衍生出了读者写者模型,在这个模型中,有两类线程:读者和写者。读者线程读取共享资源,而写者线程则修改共享资源,读者和读者之间为共享关系,写者和写者为同步互斥关系,读者和写者之间为互斥关系。
该模型有两种策略:

读者优先策略

在读者优先策略中,允许多个读者同时访问共享资源,有读者在读时,写者必须等待,直到所有当前的读者和写者都完成访问。这种策略可以提高并发度,但可能导致写者饥饿。

写者优先策略

在写者优先策略中,一旦有写者等待,新的读者必须等待,直到所有当前的读者和写者都完成访问。这种策略可以减少写者的等待时间,但可能导致读者饥饿。

通常而言,在读的过程中,往往伴随着查找的操作,中间耗时很长。给这种代码段加锁,会极大地降低我们程序的效率。那么有没有一种方法,可以专门处理这种多读少写的情况呢? 在Linux系统中,可以使用信号量(Semaphore)或读写锁(Read-Write Lock)来解决读者写者问题。信号量可以用来实现互斥访问,而读写锁则可以允许多个读者同时访问,但在有写者等待时,新的读者必须等待,接下来我们介绍读写锁。

2.读写锁

  • 读模式(共享模式)
    • 多个线程可以同时以读模式持有读写锁。当一个线程以读模式获取到读写锁后,其他线程如果也想要以读模式获取该锁,是可以成功获取的。这是因为多个读操作通常不会相互干扰,不会破坏数据的一致性。例如,多个线程同时读取一个共享文件的内容,它们可以同时进行,不会有冲突。
  • 写模式(独占模式)
    • 只有一个线程可以以写模式持有读写锁。当一个线程以写模式获取到读写锁时,其他任何线程(无论是想要以读模式还是写模式获取该锁)都必须等待。这是因为写操作会修改共享资源,如果有其他线程同时进行读或写操作,可能会导致数据不一致。例如,当一个线程正在修改一个共享文件时,不允许其他线程同时读取或修改该文件。

在Linux中,读写锁的类型为 pthread_rwlock_t,其使用方法与互斥锁基本一致。

读写锁的创建

1. 可以使用PTHREAD_RWLOCK_INITIALIZER初始化创建全局的读写锁,并且无需销毁。

pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;
2. 使用 pthread_rwlock_init 函数初始化读写锁。
int pthread_rwlock_init(pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr);

参数:

  • rwlock:指向要初始化的读写锁对象的指针。
  • attr:指向读写锁属性对象的指针,如果不需要特殊属性,可以设置为 NULL,使用默认属性。

函数成功时返回 0;失败时返回错误码。

加锁

int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);

pthread_rwlock_rdlock 用于给读写锁申请一个读锁。如果读写锁当前没有被写锁占用,那么调用线程可以立即获得读锁。如果读写锁当前被写锁占用,那么调用线程将被阻塞,直到写锁被释放。

int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);

pthread_rwlock_wrlock 用于给读写锁申请一个写锁。如果读写锁当前没有被任何锁占用,那么调用线程可以立即获得写锁。如果读写锁当前被读锁或写锁占用,那么调用线程将被阻塞,直到所有的读锁和写锁都被释放。

rwlock:指向要申请读锁的读写锁对象的指针。

解锁

int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);

pthread_rwlock_unlock 函数用于释放之前通过 pthread_rwlock_rdlock(读锁)或者 pthread_rwlock_wrlock(写锁)获取的读写锁。

读写锁的销毁

int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);

3.基于读写锁实现的读者写者模型

基于读写锁,我们来实现一个测试代码看看效果

#include <iostream>
#include <pthread.h>
#include <string>
#include <unistd.h>
using namespace std;
int g_tickets = 100;
pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER; // 读写锁
struct ThreadData
{pthread_t tid;string name;
};
void *ReaderRoutinue(void *arg)
{ThreadData *reader = static_cast<ThreadData *>(arg);while (true){usleep(1000);pthread_rwlock_rdlock(&rwlock); // 读锁if (g_tickets > 0)cout << reader->name << " check a ticket-" << g_tickets << endl;else{pthread_rwlock_unlock(&rwlock);break;}pthread_rwlock_unlock(&rwlock);}return nullptr;
}
void *WriterRoutinue(void *arg)
{ThreadData *writer = static_cast<ThreadData *>(arg);while (true){usleep(2000);pthread_rwlock_wrlock(&rwlock); // 写锁if (g_tickets > 0)cout << writer->name << " get a ticket-" << g_tickets-- << endl;else{pthread_rwlock_unlock(&rwlock);break;}pthread_rwlock_unlock(&rwlock);}return nullptr;
}
int main()
{ThreadData readers[5];ThreadData writers[2];for (int i = 0; i < 5; i++){readers[i].name = "Reader-" + to_string(i + 1);pthread_create(&readers[i].tid, nullptr, ReaderRoutinue, &readers[i]);}for (int i = 0; i < 2; i++){writers[i].name = "Writer-" + to_string(i + 1);pthread_create(&writers[i].tid, nullptr, WriterRoutinue, &writers[i]);}for (int i = 0; i < 5; i++)pthread_join(readers[i].tid, nullptr);for (int i = 0; i < 2; i++)pthread_join(writers[i].tid, nullptr);return 0;
}

http://www.tj-hxxt.cn/news/40564.html

相关文章:

  • 做网站的不给做robots文件营销软文模板
  • 网站手机版二维码怎么做今日新闻联播主要内容摘抄
  • 专门做辅助的网站上海百网优seo优化公司
  • 外贸营销型网站建站100个商业经典案例
  • 网站开发哪家好杭州优化seo
  • 源代码建网站网站收录什么意思
  • 自己申请一个网站怎么做长沙百度搜索排名优化
  • 修改公司网站好用的推广平台
  • 什么在线做动图的网站比较好seo短期培训班
  • 贵州城乡建设厅官网南平seo
  • 建设蒙古语网站怎么创建自己的免费网址
  • 网站建设设计公司+知乎今日热点新闻视频
  • 公司有网站域名 如何做网站线上营销技巧和营销方法
  • linux新建网站北京十大最靠谱it培训机构
  • wordpress分享小图片不谷歌seo软件
  • 网站开发过程中感想在线培训平台
  • 口碑营销的好处廊坊seo关键词优化
  • 外部网站链接怎么做搜索引擎营销概念
  • 高邮建设局网站友点企业网站管理系统
  • 深圳著名设计网站大全排名第一的玉米品种
  • 网站后台如何更新无锡百度推广公司哪家好
  • 小程序网站制作公司seo自动推广软件
  • 黑马程序员项目库seo网站优化培训要多少钱
  • 让做网站策划没经验怎么办河北seo网络优化师
  • 洛阳哪里做网站网络营销软件推广
  • iis 建立子网站独立站seo怎么做
  • 专做教育网站拿站百度网盘app官网
  • 怎么做网页设计怎么插入图片seo网站排名优化教程
  • 武汉网站推广和优化深圳搜索引擎
  • 做网站哪些公司好免费创建属于自己的网站