读写锁

博客提及了trylock相关内容,但信息较少,推测围绕trylock展开解读。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*)
{
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值