- 浏览: 722862 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (1043)
- 数据结构 (36)
- UML与设计模式 (42)
- c++ (87)
- rust (36)
- Qt (41)
- boost模板元编程 (43)
- Linux (77)
- 汇编 (4)
- 其它 (2)
- 烹饪 (3)
- unix c / socket (73)
- 软件工程 (4)
- shell (52)
- Python (37)
- c++ primer 5th(c++11) (22)
- 数据库/MySQL (27)
- 数据存储 (4)
- lisp (7)
- git (4)
- Utility (3)
- CDN与DNS (54)
- Http (53)
- php (7)
- nginx/lua/openresty (41)
- redis (11)
- TCP/IP (16)
- 互联网 (6)
- kernel (2)
- go (34)
- 区块链 (43)
- 比特股 (13)
- 以太坊 (23)
- 比特币 (23)
- 密码学 (10)
- EOS (53)
- DAG (1)
- docker (1)
- filecoin (7)
- solidity (64)
- ipfs (8)
- 零知识证明 (1)
- openzeppelin (3)
- java (1)
- defi (7)
最新评论
#include <pthread.h> #include <iostream> #include <unistd.h> using namespace std; pthread_rwlock_t g_mutex = PTHREAD_RWLOCK_INITIALIZER; int g_num = 0; int g_loopNum = 10000; int g_usleepTime = 1; void* testRead1(void*) { for(int i=0;i<g_loopNum;i++) { int ret = pthread_rwlock_rdlock(&g_mutex); if(ret!=0){ cout << "read1 lock fail,num:" << g_num << endl; }else{ pthread_rwlock_unlock(&g_mutex); } usleep(g_usleepTime); } pthread_detach(pthread_self()); return 0; } void* testRead2(void*) { for(int i=0;i<g_loopNum;i++) { int ret = pthread_rwlock_rdlock(&g_mutex); if(ret!=0){ cout << "read2 lock fail,num:" << g_num << endl; }else{ pthread_rwlock_unlock(&g_mutex); } usleep(g_usleepTime); } pthread_detach(pthread_self()); return 0; } void* testWrite1(void*) { int failTime = 0; for(int i=0;i<g_loopNum;i++) { int wrRet = pthread_rwlock_trywrlock(&g_mutex); if(wrRet!=0) { failTime++; cout << "testWrite1 lock fail:" << failTime <<",curr num:" << g_num << endl; }else { g_num++; pthread_rwlock_unlock(&g_mutex); usleep(g_usleepTime); } } pthread_detach(pthread_self()); return 0; } void* testWrite2(void*) { int failTime = 0; for(int i=0;i<g_loopNum;i++) { int wrRet = pthread_rwlock_trywrlock(&g_mutex); if(wrRet!=0) { failTime++; cout << "testWrite2 lock fail:" << failTime << ",curr num:" << g_num << endl; }else { g_num++; pthread_rwlock_unlock(&g_mutex); usleep(g_usleepTime); } } pthread_detach(pthread_self()); return 0; } int main() { pthread_t pidRead1,pidRead2,pidWrite1,pidWrite2; pthread_create(&pidWrite1,NULL,testWrite1,NULL); pthread_create(&pidWrite2,NULL,testWrite2,NULL); pthread_create(&pidRead1,NULL,testRead1,NULL); pthread_create(&pidRead2,NULL,testRead2,NULL); sleep(10); } testWrite2 lock fail:1,curr num:691 testWrite2 lock fail:2,curr num:1062 testWrite1 lock fail:1,curr num:2446 testWrite1 lock fail:2,curr num:2484 testWrite1 lock fail:3,curr num:2756 testWrite2 lock fail:3,curr num:3248 testWrite1 lock fail:4,curr num:3530 testWrite2 lock fail:4,curr num:4423 testWrite1 lock fail:5,curr num:4468 testWrite2 lock fail:5,curr num:4800 testWrite2 lock fail:6,curr num:4897 testWrite2 lock fail:7,curr num:5192 testWrite1 lock fail:6,curr num:5845 testWrite2 lock fail:8,curr num:6079 testWrite2 lock fail:9,curr num:6502 testWrite1 lock fail:7,curr num:6599 testWrite1 lock fail:8,curr num:6819 testWrite1 lock fail:9,curr num:7036 testWrite2 lock fail:10,curr num:7040 testWrite2 lock fail:11,curr num:7191 testWrite2 lock fail:12,curr num:7494 testWrite2 lock fail:13,curr num:7880 testWrite2 lock fail:14,curr num:9012 testWrite1 lock fail:10,curr num:9553 testWrite2 lock fail:15,curr num:9625 testWrite2 lock fail:16,curr num:9950 testWrite2 lock fail:17,curr num:11153 testWrite2 lock fail:18,curr num:11424 testWrite1 lock fail:11,curr num:12201 testWrite1 lock fail:12,curr num:13457 testWrite2 lock fail:19,curr num:14725 testWrite2 lock fail:20,curr num:16254 testWrite2 lock fail:21,curr num:16941 testWrite2 lock fail:22,curr num:17758 testWrite2 lock fail:23,curr num:17862 testWrite1 lock fail:13,curr num:17959 testWrite1 lock fail:14,curr num:18219
读也trylock的话
#include <pthread.h> #include <iostream> #include <unistd.h> using namespace std; pthread_rwlock_t g_mutex = PTHREAD_RWLOCK_INITIALIZER; int g_num = 0; int g_loopNum = 10000; int g_usleepTime = 1; void* testRead1(void*) { int failTime = 0; for(int i=0;i<g_loopNum;i++) { int ret = pthread_rwlock_tryrdlock(&g_mutex); if(ret!=0){ failTime++; cout << "read1 lock fail:" << failTime << ",curr num:" << g_num << endl; }else{ pthread_rwlock_unlock(&g_mutex); } usleep(g_usleepTime); } pthread_detach(pthread_self()); return 0; } void* testRead2(void*) { int failTime = 0; for(int i=0;i<g_loopNum;i++) { int ret = pthread_rwlock_tryrdlock(&g_mutex); if(ret!=0){ failTime++; cout << "read2 lock fail:" << failTime << ",curr num:" << g_num << endl; }else{ pthread_rwlock_unlock(&g_mutex); } usleep(g_usleepTime); } pthread_detach(pthread_self()); return 0; } void* testWrite1(void*) { int failTime = 0; for(int i=0;i<g_loopNum;i++) { int wrRet = pthread_rwlock_trywrlock(&g_mutex); if(wrRet!=0) { failTime++; cout << "testWrite1 lock fail:" << failTime <<",curr num:" << g_num << endl; }else { g_num++; pthread_rwlock_unlock(&g_mutex); usleep(g_usleepTime); } } pthread_detach(pthread_self()); return 0; } void* testWrite2(void*) { int failTime = 0; for(int i=0;i<g_loopNum;i++) { int wrRet = pthread_rwlock_trywrlock(&g_mutex); if(wrRet!=0) { failTime++; cout << "testWrite2 lock fail:" << failTime << ",curr num:" << g_num << endl; }else { g_num++; pthread_rwlock_unlock(&g_mutex); usleep(g_usleepTime); } } pthread_detach(pthread_self()); return 0; } int main() { pthread_t pidRead1,pidRead2,pidWrite1,pidWrite2; pthread_create(&pidWrite1,NULL,testWrite1,NULL); pthread_create(&pidWrite2,NULL,testWrite2,NULL); pthread_create(&pidRead1,NULL,testRead1,NULL); pthread_create(&pidRead2,NULL,testRead2,NULL); sleep(10); } read1 lock fail:1,curr num:2174 read1 lock fail:2,curr num:2536 read1 lock fail:3,curr num:2838 testWrite1 lock fail:1,curr num:2848 testWrite2 lock fail:1,curr num:3269 testWrite1 lock fail:2,curr num:3688 read1 lock fail:4,curr num:3872 testWrite2 lock fail:2,curr num:4053 testWrite2 lock fail:3,curr num:4106 read1 lock fail:5,curr num:4569 read1 lock fail:6,curr num:5755 read1 lock fail:7,curr num:6095 testWrite1 lock fail:3,curr num:6095 read1 lock fail:8,curr num:6154 testWrite2 lock fail:4,curr num:6526 read2 lock fail:1,curr num:6801 testWrite1 lock fail:4,curr num:6939 testWrite1 lock fail:5,curr num:7649 read1 lock fail:9,curr num:7786 read1 lock fail:10,curr num:7958 testWrite1 lock fail:6,curr num:8069 read1 lock fail:11,curr num:9853 read1 lock fail:12,curr num:10167 testWrite2 lock fail:5,curr num:10335 read1 lock fail:13,curr num:10699 testWrite1 lock fail:7,curr num:10735 testWrite1 lock fail:8,curr num:11027 read2 lock fail:read1 lock fail:2,curr num:1149914,curr num: 11499 testWrite2 lock fail:6testWrite1 lock fail:,curr num:9,curr num:1189611896 testWrite1 lock fail:10,curr num:11896 testWrite2 lock fail:7,curr num:11897 read2 lock fail:3,curr num:12133 read1 lock fail:15,curr num:12395 read1 lock fail:16,curr num:12813 testWrite2 lock fail:8,curr num:13051 testWrite1 lock fail:11,curr num:13084 read2 lock fail:4,curr num:13818 read1 lock fail:17,curr num:13831 read1 lock fail:18,curr num:14321 testWrite2 lock fail:9,curr num:14570 read1 lock fail:19,curr num:15401 testWrite2 lock fail:10,curr num:15527 testWrite1 lock fail:12,curr num:15633 read1 lock fail:20,curr num:16261 read1 lock fail:21,curr num:16539 testWrite1 lock fail:13,curr num:16811 read2 lock fail:5,curr num:17187 testWrite1 lock fail:14,curr num:17318 read1 lock fail:22,curr num:18077 testWrite2 lock fail:11,curr num:18108 testWrite1 lock fail:15,curr num:18109 read1 lock fail:23,curr num:18357 read1 lock fail:24,curr num:18759 testWrite1 lock fail:16,curr num:19338
发表评论
-
滑动窗口与拥塞控制
2017-09-29 14:47 729滑动窗口:用作流量控制: 1.发送端和接收端各维护一个独立的发 ... -
rawsocket发送tcp包
2017-09-25 11:52 931testTcp.h #ifndef TESTTCP_H ... -
柔性数组
2017-09-20 09:53 448#include <iostream> #i ... -
rawsocket发送dns包
2017-09-14 15:18 568#include <stdio.h> #in ... -
rawsocket发送icmp包
2017-09-06 09:54 620#include <stdio.h> #in ... -
netfilter
2016-10-04 20:31 448http://blog.chinaunix.net/uid-2 ... -
gdb的简单使用
2016-09-19 15:18 385注意编译的时间加上-g参数 1.调试运行 gdb a.out ... -
TCP各状态的意义
2016-03-01 14:06 389各个状态的意义如下: LISTEN - 侦听来自远方TCP端 ... -
log
2015-03-30 17:42 414log.h #ifndef __LOG_H__ #def ... -
TIMEWAIT与CLOSEWAIT
2015-03-17 11:32 614http://blog.csdn.net/kobejayand ... -
TcpClient
2015-01-16 17:46 441TcpClient.h #ifndef TCPCLIENT ... -
信号量
2014-09-26 10:20 649#include <semaphore.h> ... -
共享内存
2014-09-17 10:39 539SharedMemory.h #ifndef SHARED ... -
记录锁
2014-09-11 16:32 404#include <errno.h> #in ... -
popen
2014-09-06 14:50 582#include <stdio.h> #in ... -
大小端存储
2014-09-05 09:29 567#include <stdio.h> i ... -
条件变量(cond)
2014-09-01 11:02 828#include <pthread.h> # ... -
trylock
2014-09-01 10:07 641#include <pthread.h> # ... -
线程分离
2014-09-01 10:00 658http://www.cnblogs.com/mydomain ... -
线程返回值传出
2014-08-31 09:56 498#include <pthread.h> # ...
相关推荐
参考CRITICAL_SECTION的实现机制,利用CPU的LOCK指令实现读写锁的功能,同时用C++类进行了封装
windows和linux读写锁C++实现
本文实例讲述了C#解决SQlite并发异常问题的方法。分享给大家供大家参考,...作者利用读写锁(ReaderWriterLock),达到了多线程安全访问的目标。 using System; using System.Collections.Generic; using System.Text;
易语言读写锁1.2模块源码例程程序调用API函数实现读写锁功能的操作。点评:读写锁实际是一种特殊的锁,它把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则对共享资源进行写操作。这种锁相...
inux 读写锁应用实例 /*使用读写锁实现四个线程读写一段程序的实例,共创建了四个新的线程,其中两个线程用来读取数据,另外两个线程用来写入数据。在任意时刻,如果有一个线程在写数据,将阻塞所有其他线程的任何...
读写锁代码可实现对链表的加锁功能,原为并行程序设计基础书121代码实现
易语言读写锁模块源码,读写锁模块,进入,退出,读锁,写锁,解锁,InitializeCriticalSection,DeleteCriticalSection,EnterCriticalSection,LeaveCriticalSection
一般的读写锁代码,都是使用了临界体作为基本锁,这样就出现了在一个线程里获取临界体,但是却在另一个线程里释放临界体的问题。临界体是线程相关锁,必须做到获取和释放都在同一个线程。这个读写锁使用临界体和事件...
* 读写锁 * 读-读并发,读-写互斥,写-写互斥 * Windows NT下可以使用 * 基于CRITICAL_SECTION实现,简单高效,只支持在进程内使用,不支持进程间使用 * 支持限制最大并发读者数 * 写操作优先(即当前有线程...
主要通过案例演示了mysql的读写锁问题;帮助理解读写锁的概念、特征。主要通过案例演示了mysql的读写锁问题;帮助理解读写锁的概念、特征。主要通过案例演示了mysql的读写锁问题;帮助理解读写锁的概念、特征。主要...
@youcanyouup。Tags:线程安全原子锁读写锁。
读写锁的类 及demo 基于网上的类 改写了几处逻辑不合理的地方 :1、新的读锁来了如已有写锁等待 新的读锁进入等待 2、等待的读锁获取到执行权限后 把正等待的所有读锁全部激活
java 读写锁实例代码,付简单注释,测试完整。
读写锁实现例子
在linux下按照windows的slim read/write lock算法实现的读写锁源码。
简单读写锁实例代码
在linux下有两种实现数据互斥的基本机制,包括了信号量,自旋锁。这里要说的读写锁是自旋锁的一个变种
读写锁的设计实现等.。。。。。。。。。。。。。。。。。。。。
本文主要介绍了C#使用读写锁三行代码简单解决多线程并发写入文件时提示“文件正在由另一进程使用,因此该进程无法访问此文件”的问题。需要的朋友可以参考借鉴
Linux系统编程——线程同步与互斥:读写锁,相关教程链接如下: http://blog.csdn.net/tennysonsky/article/details/46485735