笔记2 linux多线程 读写锁

//read write lock
#include<stdio.h>
#include<unistd.h>
#include<pthread.h>

struct test
{
    char a[10];
    char b[10];
    char c[10];
}yb = {"111","222","33333"};

static int j=0;

pthread_rwlock_t mutex_1;

void Print1(struct test *arg)
{
    pthread_rwlock_rdlock(&mutex_1);
    printf("a=%s,b=%s,c=%s,d=%X,j=%d\n",arg->a,arg->b,arg->c,pthread_self(),j++);
    sleep(2);
    pthread_rwlock_unlock(&mutex_1);
    pthread_exit((void *)j);
    printf("Never Coming.\n");
}

struct test *Print2(struct test *arg)
{
    pthread_rwlock_wrlock(&mutex_1);
    struct test *p = NULL;
    p = arg;
    memcpy(p->a,"fff",3);
    memcpy(p->b,"ggg",3);
    memcpy(p->c,"ttt",3);
    pthread_rwlock_unlock(&mutex_1);
    pthread_exit((void *)0);
}

int main()
{
    pthread_t pid1,pid2,pid3,pid4;
    void *set;

    pthread_rwlock_init(&mutex_1,NULL);

    pthread_create(&pid1,NULL,&Print1,&yb);
    sleep(1);
    pthread_create(&pid2,NULL,&Print2,&yb);
    pthread_create(&pid3,NULL,&Print1,&yb);
    sleep(10);
    pthread_create(&pid4,NULL,&Print1,&yb);

    pthread_join(pid1,&set);
    printf("pid1 exit coed %d\n",(int)set);
    pthread_join(pid2,&set);
    printf("pid2 exit coed %d\n",(int)set);
    pthread_join(pid3,&set);
    printf("pid3 exit coed %d\n",(int)set);
    pthread_join(pid4,&set);
    printf("pid4 exit coed %d\n",(int)set);

    pthread_rwlock_destroy(&mutex_1);
    sleep(1);
    return 0;
}
时间: 2024-11-06 11:32:05

笔记2 linux多线程 读写锁的相关文章

多线程读写锁机制

1 #include <stdio.h> 2 #include <pthread.h> 3 #include <stdio.h> 4 #include <errno.h> 5 #include <stdlib.h> 6 static pthread_rwlock_t rwlock; 7 #define WORK_SIZE 1024 8 char work_area[WORK_SIZE]; 9 int time_to_exit=0; 10 11 v

java多线程-读写锁

Java5 在 java.util.concurrent 包中已经包含了读写锁.尽管如此,我们还是应该了解其实现背后的原理. 读/写锁的 Java 实现(Read / Write Lock Java Implementation) 读/写锁的重入(Read / Write Lock Reentrance) 读锁重入(Read Reentrance) 写锁重入(Write Reentrance) 读锁升级到写锁(Read to Write Reentrance) 写锁降级到读锁(Write to

笔记3 linux 多线程 条件变量+互斥锁

//cond lock #include<stdio.h> #include<unistd.h> #include<pthread.h> struct test { char a[10]; char b[10]; char c[10]; }yb = {"111","222","33333"}; static int j=0; pthread_mutex_t mutex_1 = PTHREAD_MUTEX_INI

笔记1 linux 多线程 互斥锁

//mutex lock #include<stdio.h> #include<unistd.h> #include<pthread.h> struct test { char a[10]; char b[10]; char c[10]; }yb = {"111","222","33333"}; static int j=0; pthread_mutex_t mutex_1 = PTHREAD_MUTEX_IN

用信号量和读写锁解决读者写者问题

读者写者问题是非常经典的同步问题,本文首先用信号量来解决这个问题,并结合代码分析什么是读者优先.什么是写者优先,然后给出读写锁的解决方案,并指出在Linux下读写锁的注意事项. 读者写者问题 读者写者问题描述的是这么一种情况:对象在多个线程(或者进程)之间共享,其中一些线程只会读数据,另外一些线程只会写数据.为了保证写入和读取的正确性,我们需要保证,只要有线程在写,那么其他线程不能读,否则可能读到写了一半的数据:另外,也不能有两个线程同时写,否则导致数据错乱.当然,多个线程是可以同时读数据. 读

自旋锁&amp;读/写锁

自旋锁 自旋锁(spin lock)是用来在多处理器环境中工作的一种特殊的锁.如果内核控制路径发现自旋锁"开着",就获取锁并继续自己的执行.相反,如果内核控制路径发现由运行在另一个CPU上的内核控制路径"锁着",就在一直循环等待,反复执行一条紧凑的循环指令,直到锁被释放. 一般来说,由自旋锁所保护的每个临界区都是禁止内核抢占的.在单处理器系统上,这种锁本身并不起锁的作用,自旋锁原语仅仅是禁止或启用内核抢占.请注意,在自旋锁忙等期间,内核抢占还是有效的,因此,等待自旋

Linux程序设计学习笔记----多线程编程线程同步机制之互斥量(锁)与读写锁

互斥锁通信机制 基本原理 互斥锁以排他方式防止共享数据被并发访问,互斥锁是一个二元变量,状态为开(0)和关(1),将某个共享资源与某个互斥锁逻辑上绑定之后,对该资源的访问操作如下: (1)在访问该资源之前需要首先申请互斥锁,如果锁处于开状态,则申请得到锁并立即上锁(关),防止其他进程访问资源,如果锁处于关,则默认阻塞等待. (2)只有锁定该互斥锁的进程才能释放该互斥锁. 互斥量类型声明为pthread_mutex_t数据类型,在<bits/pthreadtypes.h>中有具体的定义. 互斥量

Linux多线程实践(6) --Posix读写锁解决读者写者问题

Posix读写锁 int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr); int pthread_rwlock_destroy(pthread_rwlock_t *rwlock); int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock); int pthread_rwlock_wrlock(pthre

《Linux多线程服务端编程——使用muduo C++网络库》学习笔记

第一章 线程安全的对象生命期管理 第二章 线程同步精要 第三章 多线程服务器的适用场合与常用编程模型 第四章 C++多线程系统编程精要 1.(P84)11个常用的最基本Pthreads函数: 2个:线程的创建和等待结束(join).封装为muduo::Thread 4个:mutex的创建.销毁.加锁.解锁.封装为muduo::MutexLock 5个:条件变量的创建.销毁.等待.通知.广播.muduo::Condition 2.(P85)不推荐使用读写锁的原因是它往往造成提高性能的错觉(允许多个