今天测试时发现程序经常崩溃,代码大意如下:


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));
}

线程锁并不是想象的那样可靠相关推荐

  1. 嵌入式 linux 进程锁,嵌入式  Linux线程锁详解pthread_mutexattr_t

    在Posix Thread中定义有一套专门用于线程同步的mutex函数. 1. 创建和销毁 有两种方法创建互斥锁,静态方式和动态方式.POSIX定义了一个宏PTHREAD_MUTEX_INITIALI ...

  2. 多线程并发安全问题与线程锁

    一.多线程并发安全问题 二.什么是线程锁及分类 三.synchronized关键字 多线程并发安全问题 当多个线程并发操作同一临界资源,由于线程切换时机不确定,导致操作临界资源的顺序出现混乱严重时可能 ...

  3. Linux 线程锁详解

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 在Pos ...

  4. Python 多线程总结(2)— 线程锁、线程池、线程数量、互斥锁、死锁、线程同步

    主要介绍使用 threading 模块创建线程的 3 种方式,分别为: 创建 Thread 实例函数 创建 Thread 实例可调用的类对象 使用 Thread 派生子类的方式 多线程是提高效率的一种 ...

  5. python中gil锁和线程锁_Python线程——GIL锁、线程锁(互斥锁)、递归锁(RLock)...

    GIL锁 ​ 计算机有4核,代表着同一时间,可以干4个任务.如果单核cpu的话,我启动10个线程,我看上去也是并发的,因为是执行了上下文的切换,让看上去是并发的.但是单核永远肯定时串行的,它肯定是串行 ...

  6. python 线程锁 共享全局变量 线程通信

    python 线程锁 共享全局变量 线程通信 注意:全局变量不必做为参数传到函数里!!! import threading # 银行存钱和取钱 # 存钱1万次 def add():global mon ...

  7. 分布式锁,进程锁,线程锁到底是什么

    在分布式集群系统的开发中,线程锁往往并不能支持全部场景的使用,必须引入新的技术方案分布式锁. 线程锁:大家都不陌生,主要用来给方法.代码块加锁.当某个方法或者代码块使用锁时,那么在同一时刻至多仅有有一 ...

  8. python是如何实现进程池和线程池的_高并发:线程、线程锁与线程池(精华),手写代码实现线程池...

    前文: 单线程--多线程的开启--线程锁--线程同步工具--手写连接池--连接池工具类. 一.线程 1.线程的概念 2.线程与进程的关系 3.定义: 区别:如上!!! 4.wait()和sleep() ...

  9. python多线程_【python多线程02】各种线程锁

    0x00 前言 本片文章讲述了小明同学在编写python多线程过程中遇到一些奇怪现象,小明根据这些奇怪现象挖掘背后的原因...通过遇到的问题,引申出全局解释器锁,同步锁,递归锁,信号量... 0x01 ...

  10. 一句话说清分布式锁,进程锁,线程锁

    一句话说清分布式锁,进程锁,线程锁 在分布式集群系统的开发中,线程锁往往并不能支持全部场景的使用,必须引入新的技术方案分布式锁. 线程锁,进程锁,分布式锁 线程锁:大家都不陌生,主要用来给方法.代码块 ...

最新文章

  1. 皮一皮:这算画蛇添足?
  2. 记录一次缓存系统的优化过程
  3. Linux--轻松定义自己的RPM/DEB软件包
  4. 如何将char类型数据转化给int
  5. apache虚拟主机301跳转问题
  6. java多个类共享的数据_Java---多线程基础总结
  7. 修改chrome中HTML元素,自由更改网页中的任何内容:Hack this page
  8. 1.4.PHP7.1 狐教程-环境(Mac下 PHP开发环境 配置及安装 php7.1.x nginx mysql)
  9. 《轻松读懂spring》之 IOC的主干流程(上)
  10. h5 富文本输入框_Html富文本编辑器
  11. java中清空文件夹_java 删除文件夹中的所有内容而不删除文件夹本身的实例
  12. expected primary-expression before ‘int‘
  13. 清理Win10系统C盘的脚本方法
  14. 菜鸟html在线运行,菜鸟操作—HTML5制作影视简介
  15. 假如生命是乏味的,我怕有来生;假如生命是有趣的,今生已是满足。
  16. python药店销售数据分析_药房销售情况分析(python篇)
  17. 删 卡尔 波普尔_卡尔波普尔哲学语录28句,深度揭示生活中的错误
  18. 细胞实验关键:活死细菌/细胞染色试剂盒解决方案
  19. 天载优配简述题材炒作与业绩挖掘并行
  20. 西南政法大学计算机课程要求,西南政法大学本科课程教学改革办法

热门文章

  1. 提高Office2010等高版的启动速度文章链接收集-Office2010打开慢速度怎么办?
  2. OKHttp源码解析(1)----整体流程
  3. 一些有用的收藏201808
  4. Redis源码阅读-Dict哈希字典
  5. 线段树(区间合并) HDOJ 3308 LCIS
  6. M2M技术、标准与智慧城市顶层设计方法
  7. 讨厌的迅雷占用80口
  8. Android的banner(轮播图)的实现
  9. 强化学习ppt_东台中等专业学校北大青鸟班PPT演讲大赛颁奖典礼顺利举行
  10. java链式语法_javaScript链式调用原理以及加法实现