代码编织梦想

#一些概念
线程同步:协同步调,对公共区域数据按序访问。防止数据混乱,产生与时间有关的错误。
锁的使用:建议锁!对公共数据进行保护。所有线程应该在访问公共数据前先拿锁再访问。
但,锁本身不具备强制性。
死锁:1、线程试图对同一个互斥量A加锁两次;
2、线程1拥有A锁,请求获得B锁;线程2拥有B锁,请求获得A锁。
读写锁:只有一把锁,读时共享,写的优先级更高。
使用mutex(互斥量、互斥锁)一般步骤:
1、pthread_mutex_t lock;创建锁
2、pthread_mutex_init;初始化
3、pthread_mutex_lock;加锁
4、访问共享数据(stdout)
5、pthread_mutex_unlock();解锁
6、pthread_mutex_destory;销毁锁
注意事项:
尽量保证锁的粒度,越小越好(访问共享数据前,加锁。访问结束立即解锁)
互斥锁,本质是结构体
restrict关键字:用来限定指针变量。被该关键字限定的指针变量所指向的内存操作,必须由本指针完成
lock:加锁失败会阻塞,等待锁被释放
trylock:加锁失败直接返回错误号
#加锁代码示例:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<errno.h>
#include<pthread.h>

pthread_mutex_t mutex;      //定义一把互斥锁
void *tfn(void *arg){
	srand(time(NULL));
	while(1){
		pthread_mutex_lock(&mutex);
		printf("hello ");
		sleep(rand()%1);
		printf("world\n");
		sleep(rand()%1);
		pthread_mutex_unlock(&mutex);
	}
	return NULL;
}
int main(void){
	pthread_t tid;
	srand(time(NULL));
	int ret=pthread_mutex_init(&mutex,NULL);    //初始化互斥锁
	if(ret!=0){
		fprintf(stderr,"mutex init error:%s\n",strerror(ret));
		exit(1);
	}
	pthread_create(&tid,NULL,tfn,NULL);
	while(1){
		pthread_mutex_lock(&mutex);            //加锁
		printf("HELLO ");
		sleep(rand()%1);
		printf("WORLD\n");
		pthread_mutex_unlock(&mutex);         //解锁
	}
	pthread_join(tid,NULL);
	pthread_mutex_destory(&mutex);            //销毁互斥锁
	return 0;
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/shanghuaren/article/details/127884692

linux系统编程:线程同步-读写锁(rwlock)-爱代码爱编程

                              线程同步-读写锁(rwlock) 读写锁 读写锁是互斥量的细化:显然,只有对全局资然进行写入操作时,才需要同步;在对全局资然进行读取操作时,是不需要锁的。 相关函数 pthread_rwlock_t //读写锁类型 pthread_rwlock_init //初始化 pthread_rwl

linux线程同步的方法_青丶空゛的博客-爱代码爱编程_不属于linux编程下线程同步的方法

#Linux 线程同步的三种方法 线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点。linux下提供了多种方式来处理线程同步,最常用的是互斥锁、条件变量和信号量。 ##一、互斥锁(mutex) 通过

linux线程及线程同步(锁的应用)_年纪青青的博客-爱代码爱编程

linux线程 linux原本没有线程,后来在windows多线程编程影响下linux内核开发者在进程基础上在功能上做出了类似windows线程的linux版本的线程,linux线程归根到底还是进程,只不过是轻量级的

Linux系统编程:多线程交替打印ABC-爱代码爱编程

引言 分享关于线程的一道测试题,因为网上基本都是Java的解决方法,决定自己写一篇来记录一下线程的学习。 问题描述 编写一个至少具有三个线程的程序(称之为线程 A、B 和 C),其中线程 A 输出字符’A’,线程 B 输出字符’B’,线程 C 输出字符’C’。使得最终输出结果为“ABCABCABC…”。 思路 拿到这题后,我的想法是把问题简化。

linux:线程同步的5种方法-爱代码爱编程

linux:线程同步的5种方法 一.为什么要使用线程:二.线程同步的5种方法2.1 互斥量2.2 读写锁2.3 条件变量2.4 自旋锁2.5 屏障 一.为什么要使用线程: <1>. 通过为每种事件类型分配单独的处理线程,可以简化处理异步事件的代码。每个线程在进行事件处理时可以采用同步编程模式,同步编程模式要比异步编程模式简单得多

【Linux】多线程--互斥锁-爱代码爱编程

文章目录 前言基础概念互斥量mutex多线程模拟抢票(没加锁情况)为何多线程访问临界资源是不安全互斥锁相关接口多线程模拟抢票(有加锁)互斥锁实现的基本原理 前言 为什么线程需要同步和互斥的操作? 因为线程引入共享了进程的地址空间,导致了一个线程操作数据时候,极其容易影响到其他线程的情况;对其他线程造成不可控因素,或引起异常,逻辑结果不正确的情

linux系统如何重装windows系统_linux重装windows-爱代码爱编程

背景 因为种种原因安装了Linux系统Ubuntu 18.04.6,随之迎来了种种麻烦,于是决定安装回Windows 10系统。 安装步骤如下: 安装步骤 一、选择需要安装的系统二、查看CPU运行位数三、下载镜