IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++笔记--Linux编程(14)-线程同步 -> 正文阅读

[C++知识库]C++笔记--Linux编程(14)-线程同步

目录

线程同步技术

说明

互斥锁?

加锁和解锁函数?

使用mutex线程同步示例

读写锁

读写锁状态

读写锁特性

读写锁示例


线程同步技术

说明

????????线程共享进程的内存空间,打开的文件描述符,全局变量。

????????当有多个线程同时访问一块内存空间或者一个变量、一个文件描述符,如果不加控制,那么可能会出现意想不到的结果。

互斥锁?

????????互斥(mutex)是相互排斥的意思,它是一种锁或者信号灯。

????????互斥用来保护多个线程共享的数据和结构不会被同时修改,一个互斥锁只能有两个状态

???????????????? locked---加锁

????????????????unlocked---解锁

????????加锁后互斥不让其他线程访问。

????????任何时刻只能有一个线程来掌握某个互斥上锁。

????????一个线程如果试图在一个已经加锁的互斥上再加锁,这个线程会被挂起,直到加锁的线程释放掉互斥锁为止。??

加锁和解锁函数?

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);

PTHREAD_MUTEX_INITIALIZER是初始化一个快速锁的宏定义。

pthread_mutex_lock用于给mutex加锁。

pthread_mutex_unlock用于给mutex解锁。

需引入pthread.h

使用mutex线程同步示例

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void *func(void *arg)
{
	pthread_mutex_lock(&mutex);
	int *a = (int *)arg;
	printf("thread%d start\n", *a);
	int i;
	for(i=0;i<10;i++)
	{
		printf("thread%d is running\n", *a);
		sleep(1);
	}
	printf("thread%d end\n", *a);
	pthread_mutex_unlock(&mutex);
	pthread_exit(NULL);
}
int main(int arg, char * args[])
{
	printf("process start\n");
	pthread_t thr_d1, thr_d2;
	int i[2];
	i[0] = 1; i[1] =2;
	pthread_create(&thr_d1, NULL, func, &i[0]);
	pthread_create(&thr_d2, NULL, func, &i[1]);
	pthread_join(thr_d1, NULL);
	pthread_join(thr_d2, NULL);
	printf("process end\n");
	return 0;
}

读写锁

?与互斥锁类似,但读写允许更高的并行性。其特点:写独占,读共享

读写锁状态

?具备三种状态:

? ? ? ? 1. 读模式下加锁状态(读锁)

? ? ? ? 2. 写模式下加锁状态(写锁)

? ? ? ? 3. 不加锁状态

读写锁特性

? ? ? ? 1. 读写锁是“写模式加锁”时,解锁前,所有对该锁加锁的线程都会被阻塞

? ? ? ? 2. 读写锁是“读模式加锁”时,如果线程以读模式对其加锁会成功;如果线程以写模式加锁会阻塞

读写锁示例

//
// Created by xiangjia on 2021/8/8.
//
#include "stdio.h"
#include "stdlib.h"
#include "unistd.h"
#include "pthread.h"
int beginnum = 100;

pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;

void* thr_write(void *arg) {
    while(1) {
        pthread_rwlock_wrlock(&rwlock);
        printf("--%s--self--%lu--%d\n", __FUNCTION__, pthread_self(), beginnum++);
        sleep(2);
        pthread_rwlock_unlock(&rwlock);
        sleep(3);
    }
}

void* thr_read(void*arg) {
    while (1) {
        pthread_rwlock_rdlock(&rwlock);
        printf("--%s--self--%lu--%d\n", __FUNCTION__, pthread_self(), beginnum++);
        sleep(2);
        pthread_rwlock_unlock(&rwlock);
        sleep(3);
    }
}

int main() {
    int n=8,i=0;
    pthread_t tid[8];
    for(i=0; i<5; i++) {
        pthread_create(&tid[i], NULL, thr_read, NULL);
    }
    for(; i<8; i++) {
        pthread_create(&tid[i], NULL, thr_write, NULL);
    }

    for(i=0; i<8; i++) {
        pthread_join(tid[i], NULL);
    }

    return 0;
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-09 10:03:37  更:2021-08-09 10:04:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/10 0:27:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码