`

读写锁

 
阅读更多
#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
分享到:
评论

相关推荐

    WINDOWS读写锁实现

    参考CRITICAL_SECTION的实现机制,利用CPU的LOCK指令实现读写锁的功能,同时用C++类进行了封装

    windows和linux读写锁C++实现

    windows和linux读写锁C++实现

    C#解决SQlite并发异常问题的方法(使用读写锁)

    本文实例讲述了C#解决SQlite并发异常问题的方法。分享给大家供大家参考,...作者利用读写锁(ReaderWriterLock),达到了多线程安全访问的目标。 using System; using System.Collections.Generic; using System.Text;

    易语言读写锁1.2模块源码

    易语言读写锁1.2模块源码例程程序调用API函数实现读写锁功能的操作。点评:读写锁实际是一种特殊的锁,它把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则对共享资源进行写操作。这种锁相...

    linux 读写锁应用实例

    inux 读写锁应用实例 /*使用读写锁实现四个线程读写一段程序的实例,共创建了四个新的线程,其中两个线程用来读取数据,另外两个线程用来写入数据。在任意时刻,如果有一个线程在写数据,将阻塞所有其他线程的任何...

    读写锁_读写锁_

    读写锁代码可实现对链表的加锁功能,原为并行程序设计基础书121代码实现

    易语言读写锁模块

    易语言读写锁模块源码,读写锁模块,进入,退出,读锁,写锁,解锁,InitializeCriticalSection,DeleteCriticalSection,EnterCriticalSection,LeaveCriticalSection

    读写锁实现代码

    一般的读写锁代码,都是使用了临界体作为基本锁,这样就出现了在一个线程里获取临界体,但是却在另一个线程里释放临界体的问题。临界体是线程相关锁,必须做到获取和释放都在同一个线程。这个读写锁使用临界体和事件...

    C++的线程读写锁(windows实现)

    * 读写锁 * 读-读并发,读-写互斥,写-写互斥 * Windows NT下可以使用 * 基于CRITICAL_SECTION实现,简单高效,只支持在进程内使用,不支持进程间使用 * 支持限制最大并发读者数 * 写操作优先(即当前有线程...

    mysql读写锁演示案例

    主要通过案例演示了mysql的读写锁问题;帮助理解读写锁的概念、特征。主要通过案例演示了mysql的读写锁问题;帮助理解读写锁的概念、特征。主要通过案例演示了mysql的读写锁问题;帮助理解读写锁的概念、特征。主要...

    易语言线程安全之原子锁与读写锁

    @youcanyouup。Tags:线程安全原子锁读写锁。

    windows 读写锁 (基于关键区的读写锁类 及自动锁)

    读写锁的类 及demo 基于网上的类 改写了几处逻辑不合理的地方 :1、新的读锁来了如已有写锁等待 新的读锁进入等待 2、等待的读锁获取到执行权限后 把正等待的所有读锁全部激活

    java 读写锁代码

    java 读写锁实例代码,付简单注释,测试完整。

    读写锁实现例子

    读写锁实现例子

    linux下实现高性能读写锁(read/write lock)

    在linux下按照windows的slim read/write lock算法实现的读写锁源码。

    简单读写锁实例代码

    简单读写锁实例代码

    linux写优先的读写锁设计

    在linux下有两种实现数据互斥的基本机制,包括了信号量,自旋锁。这里要说的读写锁是自旋锁的一个变种

    同步 读写锁 readwriteLock

    读写锁的设计实现等.。。。。。。。。。。。。。。。。。。。。

    C#使用读写锁三行代码简单解决多线程并发的问题

    本文主要介绍了C#使用读写锁三行代码简单解决多线程并发写入文件时提示“文件正在由另一进程使用,因此该进程无法访问此文件”的问题。需要的朋友可以参考借鉴

    线程同步与互斥:读写锁示例代码

    Linux系统编程——线程同步与互斥:读写锁,相关教程链接如下: http://blog.csdn.net/tennysonsky/article/details/46485735

Global site tag (gtag.js) - Google Analytics