-
嵌入式 互斥锁和读写锁区别
- /*
- * 线程同步——互斥量
- * 创建两个线程,使用互斥量使任一时刻只有一个线程对全局变量进行
- 操作
- * Lzy 2011-6-19
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <pthread.h>
- pthread_mutex_t mutex; /* 定义
- 互斥量 */
- int x;
- /* 定义全局变量 */
- void thread1(void) /* 定义线程1运
- 行的函数,其功能是对全局变量x进行逐减操作 */
- {
- while(x>0)
- {
- pthread_mutex_lock(&mutex); /* 对互斥量进行
- 加锁操作 */
- printf("Thread 1 is running : x=%d
",x);
- x--;
- pthread_mutex_unlock(&mutex); /* 对互斥量进行
- 解锁操作 */
- sleep(1);
- }
- pthread_exit(NULL);
- }
- void thread2(void) /* 定义线程2运
- 行的函数,功能与thread2相同 */
- {
- while(x>0)
- {
- pthread_mutex_lock(&mutex); /* 对互斥量进行
- 加锁操作 */
- printf("Thread 2 is running : x=%d
",x);
- x--;
- pthread_mutex_unlock(&mutex); /* 对互斥量进行
- 解锁操作 */
- sleep(1);
- }
- pthread_exit(NULL);
- }
- int main(void)
- {
- pthread_t id1,id2;
- /* 定义线程的标识符 */
- int ret;
- ret = pthread_mutex_init(&mutex,NULL); /* 对互斥量进行
- 初始化,这里使用默认的属性 */
- if(ret != 0)
- {
- printf ("Mutex initialization failed.
"); /* 如果
- 初始化失败,打印错误信息 */
- exit (1);
- }
- x=10;
- /* 对全局变量赋初值 */
- ret = pthread_create(&id1, NULL, (void *)&thread1, NULL);
- /* 创建线程1 */
- if(ret != 0)
- {
- printf ("Thread1 creation failed.
");
- exit (1);
- }
- ret = pthread_create(&id2, NULL, (void *)&thread2, NULL);
- /* 创建线程2 */
- if(ret != 0)
- {
- printf ("Thread2 creation failed.
");
- exit (1);
- }
- pthread_join(id1, NULL); /*线程
- 合并 */
- pthread_join(id2, NULL);
- return (0);
- }
- /*
- * 线程同步
- * ——读写锁
- * 只要没有进程持有某个给定的读写锁用于写,那么任意数目的
- 线程都可持有该读写锁用于读
- * 仅当没有线程持有某个给定的读写锁用于读或写,才能分配该
- 读写锁用于写。
- * Lzy 2011-6-19
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <pthread.h>
- int product = 0; //定义全局变量
- pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER; //静态
- 初始化读写锁
- void * threadRead(void * arg) //线程函数读
- {
- int cnt = 0;
- while(cnt++ < 100)
- {
- pthread_rwlock_rdlock(&rwlock); //读锁
-
- printf("Read: product = %d
", product);
-
- pthread_rwlock_unlock(&rwlock); //解锁
- sleep(1);
- }
- }
- void * tidProduce(void * arg) //线程函数写 加1
- {
- int cnt = 0;
- while(cnt++ < 100)
- {
- pthread_rwlock_wrlock(&rwlock); //写锁
-
- product++;
- printf("Produce: product = %d
", product);
-
- pthread_rwlock_unlock(&rwlock); //解锁
- sleep(1);
- }
- }
- void * threadConsume(void * arg) //线程函数写 减1
- {
- int cnt = 0;
- while(cnt++ < 100)
- {
- pthread_rwlock_wrlock(&rwlock); //写锁
-
- product--;
- printf("Consume: product = %d
", product);
-
- pthread_rwlock_unlock(&rwlock); //解锁
- sleep(2);
- }
- }
- int main(void)
- {
- int i;
- pthread_t tid[10], tidconsume, tidproduce;
-
- for(i = 0; i < 2; i++)
- {
- if(pthread_create(&tid[i], NULL, threadRead,
- NULL))
- {
- printf("pthread_create error
");
- exit(0);
- }
- }
- if(pthread_create(&tidproduce, NULL, tidProduce, NULL))
- {
- printf("pthread_create error
");
- exit(0);
- }
- if(pthread_create(&tidconsume, NULL, threadConsume,
- NULL))
- {
- printf("pthread_create error
");
- exit(0);
- }
- pthread_exit(NULL); //等待所有线程结束
- return 0;
- }
-
相关阅读:
面试官让我手写一个生产者消费者模式
怎么用wait、notify巧妙的设计一个Future模式?
并发编程之Master-Worker模式
你和那些优秀的人差距在哪里?
idea 2019.3 最新版破解教程
JVM垃圾回收详解
Java类加载器和双亲委派机制
Java代理模式/静态代理/动态代理
JSP自定义标签/自定义标签打包
MyBatis关联查询 (association) 时遇到的某些问题/mybatis映射
-
原文地址:https://www.cnblogs.com/lidabo/p/5382657.html
Copyright © 2020-2023
润新知