一.CountDownLatch介绍 CountDownLatch是JDK1.5之后引入的,存在于java.util.concurrent包下,能够使一个线程等待其他线程完成动作后再执行.构造方法: public CountDownLatch(int count) { if (count < 0) throw new IllegalArgumentException("count < 0"); this.sync = new Sync(count); } 主要方法: cou…
[摘要]编译器保证volatile自己的读写有序,但由于optimization和多线程可以和非volatile读写interleave,也就是不原子,也就是没有用.C++11 supposed会支持atomic operation. ---------------------------------------------^C^V的分割线---原帖在这里-------------------------------------------------------------- 这篇文章详细剖析…
最近项目中,在使用多线程和多进程时,遇到了些问题. 问题描述:在多线程程序中fork出一个新进程,发现新的进程无法正常工作. 解决办法:将开线程的代码放在fork以后.也就是放在新的子进程中进行创建. 产生原因:在使用fork时会将原来进程中的所有内存数据复制一份保存在子进程中.但是在拷贝的时候,但是线程是无法被拷贝的.如果在原来线程中加了锁,在使用的时候会造成死锁.以下是具体的例子(转发): 在多线程程序里,在”自身以外的线程存在的状态”下一使用fork的话,就可能引起各种各样的问题.比较典型…
1.什么是false sharing 在对称多处理器(SMP)系统中,每个处理器均有属于自己的本地高速缓存区. 如图,CPU0和CPU1有各自的本地高速缓存区(cache).线程0和线程1会用到不同的变量,它们在内存中彼此相邻.内存以64字节分割高速缓存行,我们假设红色变量与蓝色变量恰好分配在同一条高速缓存行中.CPU如果想要读取变量,会以高速缓存行的形式加载到本地高速缓存区中.这个例子中,CPU0和CPU1加载了同一条高速缓存行.然后线程0修改了红色变量,线程1修改了蓝色变量,这导致了CPU1…
一.常用普通调试命令 1.简单介绍GDB 介绍: gdb是Linux环境下的代码调试⼯具.使⽤:需要在源代码⽣成的时候加上 -g 选项.开始使⽤: gdb binFile退出: ctrl + d 或 quit 2.调试过程 (1)list命令 list  linenum        显⽰binFile第linenum行周围的源代码,接着上次的位置往下列,每次列10⾏. list  function       显示函数名为function的函数的源程序 list                …
22.2 进程(process):P551时间切片(time-slicing):处理器只是完成了一个任务的一部分工作,然后完成下一个任务的一部分工作,因为处理吕每次完成工作的时间都非常短,因此看起来这些任务是同时完成的. 进程:一个运行的程序通常称为一个进程.并发进程(concurrent process):两个或多个可以同时执行的进程称为并发进程.在多个进程并发执行时,每个进程都有自己的存放程序代码和数据的存储空间,并且每个进程的存储空间对于其他进程都是受保护的,所有这些工作都由操作系统完成.…
在Linux中有两种方法用于处理线程同步:信号量和互斥量. 线程的信号量是一种特殊的变量,它可以被增加或减少,但对其的关键访问被保证是原子操作.如果一个程序中有多个线程试图改变一个信号量的值,系统将保证所有的操作都将依次进行.信号量一般常用于保护一段代码,使其每次只被一个执行线程运行.信号量是用来调协线程对共享资源的访问的. 通过使用信号量可以很好的完成线程同步.两个线程同时监视同一个信号量.A线程增加信号量的值,B线程减少信号量的值.当A线程增加信号量大于0时,B线程的等待信号量就会触发,每触…
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; //线程同步与多线程程序中的隐患 namespace Multithreading_hazard { class Program { ; static void Main(string[] args) { Thread thread1 = new Thread(SaleTicke…
在 java 程序中怎么保证多线程的运行安全?(未完成)…
为什么会排队等待? 下面的这个简单的 Java 程序完成四项不相关的任务.这样的程序有单个控制线程,控制在这四个任务之间线性地移动.此外,因为所需的资源 ― 打印机.磁盘.数据库和显示屏 -- 由于硬件和软件的限制都有内在的潜伏时间,所以每项任务都包含明显的等待时间.因此,程序在访问数据库之前必须等待打印机完成打印文件的任务,等等.如果您正在等待程序的完成,则这是对计算资源和您的时间的一种拙劣使用.改进此程序的一种方法是使它成为多线程的. 四项不相关的任务 class myclass { sta…
导入头文件 在 linux 中开发多线程程序,在使用到 pthread 系列函数的文件中,需要导入头文件: #include <pthread.h> 链接 libpthread.a 在编译的时候,需要链接 libpthread.a 库 eclipse 中添加 libpthread.a 库:Project -> Properties -> C/C++ Build -> Settings -> GCC C Linker -> Libraries1. 在 Librari…
在业务复杂的应用程序中,有时候会要求一个或者多个任务在一定的时间或者一定的时间间隔内计划进行,比如定时备份或同步数据库,定时发送电子邮件等,我们称之为计划任务.实现计划任务的方法也有很多,可以采用SQLAgent执行存储过程来实现,也可以采用Windows任务调度程序来实现,也可以使用Windows服务来完成我们的计划任务,这些方法都是很好的解决方案.但是,对于Web应用程序来说,这些方法实现起来并不是很简单的,主机服务提供商或者不能直接提供这样的服务,或者需要你支付许多额外的费用. 本文就介绍…
在JDK 1.5之前,要实现多线程的功能,得用到Thread这个类,通过这个类设计多线程程序,需要考虑性能,死锁,资源等很多因素,一句话,就是相当麻烦,而且很容易出问题.所幸的是,在JDK1.5之后,java.util.concurrent包出现了,这是一个设计良好的多线程工具类,本文就将介绍该类的基本使用方法. 按照本博的风格,依然是先扔上一段示例代码,然后我们再慢慢讲解 package com.giantray; import java.util.concurrent.CountDownLa…
http://blog.163.com/he_junwei/blog/static/1979376462014021105242552/ http://www.ibm.com/developerworks/cn/linux/l-cn-signalsec/   Linux 多线程应用中编写安全的信号处理函数 在开发多线程应用时,开发人员一般都会考虑线程安全,会使用 pthread_mutex 去保护全局变量.如果应用中使用了信号,而且信号的产生不是因为程序运行出错,而是程序逻辑需要,譬如 SIGU…
前言 在并发,多线程环境下,同步是一个很重要的环节.同步即是指进程/线程之间的执行顺序约定. 本文将介绍如何通过共享内存机制实现块内多线程之间的同步. 至于块之间的同步,需要使用到 global memory,代价较为高昂,目前使用的情况也不多,就先不介绍了. 块内同步函数:__syncthreads () 线程调用此函数后,该线程所属块中的所有线程均运行到这个调用点后才会继续往下运行. 代码示例 使用同步思想优化之前一篇博文中提到的数组求和程序.在新的程序中,让每个块中的第一个线程将块中所有线…
转:使用gdb调试多线程程序总结 一直对GDB多线程调试接触不多,最近因为工作有了一些接触,简单作点记录吧. 先介绍一下GDB多线程调试的基本命令. info threads 显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID. 前面有*的是当前调试的线程. thread ID 切换当前调试的线程为指定ID的线程. break thread_test.c:123 thread all在所有线程中相应的行上设置断点thread apply ID1 ID…
关于python多线程编程中join()和setDaemon()的用法,这两天我看网上的资料看得头晕脑涨也没看懂,干脆就做一个实验来看看吧. 首先是编写实验的基础代码,创建一个名为MyThread的 类,然后通过向这个类传入print_func这个方法,分别创建了两个子线程: #!/usr/bin/env pythonimport threadingimport time class MyThread(threading.Thread): def __init__(self, func, arg…
CString在当今软件设计界里还是小有名气的,说它是MFC中使用的最多的类一点也不过,然而在使用sdk编windows程序的时候,确不能利用CString类,只能用sdk的运行时库,比如strlen,strcpy,strstr等等,本文讨论的是在非mfc程序中使用CString类的方法,算是个引子,如果有更好的实现方法,欢迎大家讨论. 为了使用CString类,首先源文件必须是以cpp结尾的,这是因为vc默认对不同的扩展名采用不同的编译方法和错误检查,mfc的支持文件Afx.h只有由cpp为扩…
正如大家所知道的那样,多核多cpu越来越普遍了,而且编写多线程程序也是件很简单的事情.在Windows下面,调用CreateThread函数一次就能够以你想要的函数地址新建一个子线程运行.然后,事情确实你发现创建多线程根本没有让程序快多少,也没有提高多少cpu利用率,甚至可能让cpu利用率下降.唯一能够确定的是多线程能够避免界面假死.为什么会是这样的了.本文将举一些例子和讲述一些原因. 首先,我来讲一下多处理的一些知识.如下图所示,  多处理器系统也只有一个待运行的线程队列,内存中也只有一个操作…
Debugging with GDB http://www.delorie.com/gnu/docs/gdb/gdb_25.html GDB调试多线程程序总结 一直对GDB多线程调试接触不多,最近因为工作有了一些接触,简单作点记录吧. 先介绍一下GDB多线程调试的基本命令. info threads 显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID. 前面有*的是当前调试的线程. thread ID 切换当前调试的线程为指定ID的线程. break…
阿里核心系统团队博客 http://csrd.aliapp.com/?tag=pstack Linux下多线程查看工具(pstree.ps.pstack) http://www.cnblogs.com/aixingfou/archive/2011/07/28/2119875.html http://blog.csdn.net/nancygreen/article/details/14226925 先介绍一下GDB多线程调试的基本命令. info threads 显示当前可调试的所有线程,每个线程…
Jedis是一个Java语言的Redis客户端,它为Java语言连接与操作Redis提供了简单易用的接口. Jedis不是线程安全的.故不应该在多线程环境中共用一个Jedis实例.可是.也应该避免直接创建多个Jedis实例,由于这样的做法会导致创建过多的socket连接,性能不高. 要保证线程安全且获得较好的性能.能够使用JedisPool.JedisPool是一个连接池,既能够保证线程安全,又能够保证了较高的效率. 能够声明一个全局的JedisPool变量来保存JedisPool对象的引用,然…
可以用下面的命令将 cpu 占用率高的线程找出来: ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu 这个命令首先指定参数'H',显示线程相关的信息,格式输出中包含:user,pid,ppid,tid,time,%cpu,cmd,然后再用%cpu字段进行排序.这样就可以找到占用处理器的线程了. 直接使用 ps Hh -eo pid,tid,pcpu | sort -nk3 |tail 获取对于的进程号和线程号,然后跳转到3.查看哪个进程线程…
Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Future模式,关于其他多线程设计模式的地址如下: 关于其他多线程设计模式的地址如下: 关于Master-Worker模式的详解: Java多线程编程中Master-Worker模式的详解 关于Guarded Suspeionsion模式的详解: Java多线程编程中Guarded Suspeionsio…
在多线程环境中,有些事仅需要执行一次.通常当初始化应用程序时,可以比较容易地将其放在main函数中.但当你写一个库时,就不能在main里面初始化了,你可以用静态初始化,但使用一次初始化(pthread_once)会比较容易些. int pthread_once(pthread_once_t *once_control, void (*init_routine) (void)): 功能:本函数使用初值为PTHREAD_ONCE_INIT的once_control变量保证init_routine()…
在这个多核时代,如何充分利用每个 CPU 内核是一个绕不开的话题,从需要为成千上万的用户同时提供服务的服务端应用程序,到需要同时打开十几个页面,每个页面都有几十上百个链接的 web 浏览器应用程序,从保持着几 t 甚或几 p 的数据的数据库系统,到手机上的一个有良好用户响应能力的 app,为了充分利用每个 CPU 内核,都会想到是否可以使用多线程技术.这里所说的"充分利用"包含了两个层面的意思,一个是使用到所有的内核,再一个是内核不空闲,不让某个内核长时间处于空闲状态.在 C++98 …
1.进程和线程 (1)进程是资源分配的最小单位,线程是程序执行的最小单位. (2)进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段.堆栈段和数据段,这种操作非常昂贵.而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多. (3)线程之间的通信更方便,同一进程下的线程共享全局变量.静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行.不过如何处理好同步与互斥是编写多线…
转自 1.多线程在单核和多核CPU上的执行效率问题的讨论 a1: 多线程在单cpu中其实也是顺序执行的,不过系统可以帮你切换那个执行而已,其实并没有快(反而慢) 多个cpu的话就可以在两个cpu中同时执行了………….. a2: 单核CPU上运行的多线程程序, 同一时间只能一个线程在跑, 系统帮你切换线程而已, 系统给每个线程分配时间片来执行, 每个时间片大概10ms左右, 看起来像是同时跑, 但实际上是每个线程跑一点点就换到其它线程继续跑 效率不会有提高的 切换线程反倒会增加开销 a3: #3楼…
前言 在这个多核时代,如何充分利用每个 CPU 内核是一个绕不开的话题,从需要为成千上万的用户同时提供服务的服务端应用程序,到需要同时打开十几个页面,每个页面都有几十上百个链接的 web 浏览器应用程序,从保持着几 t 甚或几 p 的数据的数据库系统,到手机上的一个有良好用户响应能力的 app,为了充分利用每个 CPU 内核,都会想到是否可以使用多线程技术.这里所说的“充分利用”包含了两个层面的意思,一个是使用到所有的内核,再一个是内核不空闲,不让某个内核长时间处于空闲状态.在 C++98 的时…
一. cmake生成可调试版本的程序,该内容参考自https://www.linuxidc.com/Linux/2014-03/98622.htm 具体内容如下: 1, 使用CMAKE编译确实很方便.但CMAKE默认编译出来的程序不带有符号文件,用GDB无法调试. 2,  要编译时产生符号文件供调试,调用CMAKE时,带上 -DCMAKE_BUILD_TYPE=Debug . 例如:terminal跳转到build文件夹,输入: cmake -DCMAKE_BUILD_TYPE=Debug ..…