线程锁并不是想象的那样可靠
今天测试时发现程序经常崩溃,代码大意如下:
static void fext_queue(ImageBuffer* pSrc)
{//>=0表示初始化完成。if (g_FextThreadQueue == NULL&& g_FextThreadQueue->queue_length < GH_FEXT_QUEUE_LENGTH){pthread_mutex_lock(&(g_FextThreadQueue->queue_mutex));//------------------g_FextThreadQueue->queue_length ++;pthread_mutex_unlock(&(g_FextThreadQueue->queue_mutex));}
}
这是怎么回事?后来把queue_length输出,发现已经越界了.也就是在加锁期间,值又变化了.所以正确写法是:
static void fext_queue(ImageBuffer* pSrc)
{//>=0表示初始化完成。if (g_FextThreadQueue == NULL&& g_FextThreadQueue->queue_length < GH_FEXT_QUEUE_LENGTH){pthread_mutex_lock(&(g_FextThreadQueue->queue_mutex));//从外界进来的时候,有可能增加了.if (g_FextThreadQueue->queue_length >= GH_FEXT_QUEUE_LENGTH){g_FextThreadQueue->queue_length = 0;}//-------------------------g_FextThreadQueue->queue_length ++;pthread_mutex_unlock(&(g_FextThreadQueue->queue_mutex));}
}
或者这样写:
static void fext_queue(ImageBuffer* pSrc)
{//>=0表示初始化完成。if (g_FextThreadQueue == NULL){return;}pthread_mutex_lock(&(g_FextThreadQueue->queue_mutex));if (g_FextThreadQueue->queue_length >= GH_FEXT_QUEUE_LENGTH){g_FextThreadQueue->queue_length = 0;}//-------------------------g_FextThreadQueue->queue_length ++;pthread_mutex_unlock(&(g_FextThreadQueue->queue_mutex));
}
线程锁并不是想象的那样可靠相关推荐
- 嵌入式 linux 进程锁,嵌入式 Linux线程锁详解pthread_mutexattr_t
在Posix Thread中定义有一套专门用于线程同步的mutex函数. 1. 创建和销毁 有两种方法创建互斥锁,静态方式和动态方式.POSIX定义了一个宏PTHREAD_MUTEX_INITIALI ...
- 多线程并发安全问题与线程锁
一.多线程并发安全问题 二.什么是线程锁及分类 三.synchronized关键字 多线程并发安全问题 当多个线程并发操作同一临界资源,由于线程切换时机不确定,导致操作临界资源的顺序出现混乱严重时可能 ...
- Linux 线程锁详解
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 在Pos ...
- Python 多线程总结(2)— 线程锁、线程池、线程数量、互斥锁、死锁、线程同步
主要介绍使用 threading 模块创建线程的 3 种方式,分别为: 创建 Thread 实例函数 创建 Thread 实例可调用的类对象 使用 Thread 派生子类的方式 多线程是提高效率的一种 ...
- python中gil锁和线程锁_Python线程——GIL锁、线程锁(互斥锁)、递归锁(RLock)...
GIL锁 计算机有4核,代表着同一时间,可以干4个任务.如果单核cpu的话,我启动10个线程,我看上去也是并发的,因为是执行了上下文的切换,让看上去是并发的.但是单核永远肯定时串行的,它肯定是串行 ...
- python 线程锁 共享全局变量 线程通信
python 线程锁 共享全局变量 线程通信 注意:全局变量不必做为参数传到函数里!!! import threading # 银行存钱和取钱 # 存钱1万次 def add():global mon ...
- 分布式锁,进程锁,线程锁到底是什么
在分布式集群系统的开发中,线程锁往往并不能支持全部场景的使用,必须引入新的技术方案分布式锁. 线程锁:大家都不陌生,主要用来给方法.代码块加锁.当某个方法或者代码块使用锁时,那么在同一时刻至多仅有有一 ...
- python是如何实现进程池和线程池的_高并发:线程、线程锁与线程池(精华),手写代码实现线程池...
前文: 单线程--多线程的开启--线程锁--线程同步工具--手写连接池--连接池工具类. 一.线程 1.线程的概念 2.线程与进程的关系 3.定义: 区别:如上!!! 4.wait()和sleep() ...
- python多线程_【python多线程02】各种线程锁
0x00 前言 本片文章讲述了小明同学在编写python多线程过程中遇到一些奇怪现象,小明根据这些奇怪现象挖掘背后的原因...通过遇到的问题,引申出全局解释器锁,同步锁,递归锁,信号量... 0x01 ...
- 一句话说清分布式锁,进程锁,线程锁
一句话说清分布式锁,进程锁,线程锁 在分布式集群系统的开发中,线程锁往往并不能支持全部场景的使用,必须引入新的技术方案分布式锁. 线程锁,进程锁,分布式锁 线程锁:大家都不陌生,主要用来给方法.代码块 ...
最新文章
- 皮一皮:这算画蛇添足?
- 记录一次缓存系统的优化过程
- Linux--轻松定义自己的RPM/DEB软件包
- 如何将char类型数据转化给int
- apache虚拟主机301跳转问题
- java多个类共享的数据_Java---多线程基础总结
- 修改chrome中HTML元素,自由更改网页中的任何内容:Hack this page
- 1.4.PHP7.1 狐教程-环境(Mac下 PHP开发环境 配置及安装 php7.1.x nginx mysql)
- 《轻松读懂spring》之 IOC的主干流程(上)
- h5 富文本输入框_Html富文本编辑器
- java中清空文件夹_java 删除文件夹中的所有内容而不删除文件夹本身的实例
- expected primary-expression before ‘int‘
- 清理Win10系统C盘的脚本方法
- 菜鸟html在线运行,菜鸟操作—HTML5制作影视简介
- 假如生命是乏味的,我怕有来生;假如生命是有趣的,今生已是满足。
- python药店销售数据分析_药房销售情况分析(python篇)
- 删 卡尔 波普尔_卡尔波普尔哲学语录28句,深度揭示生活中的错误
- 细胞实验关键:活死细菌/细胞染色试剂盒解决方案
- 天载优配简述题材炒作与业绩挖掘并行
- 西南政法大学计算机课程要求,西南政法大学本科课程教学改革办法