线程

Linux 多线程通信

帅比萌擦擦* 提交于 2020-03-16 06:44:37
Linux 多线程通信 2008-03-13 11:01 19764人阅读 评论 (0) 收藏 举报 linux 多线程 thread join windows 编程 摘自资料(linux 与Windows不同) 线程间无需特别的手段进行通信,因为线程间可以共享数据结构,也就是一个全局变量可以被两个线程同时使用。不过要注意的是线程间需要做好同步,一般用mutex。可以参考一些比较新的UNIX/Linux编程的书,都会提到Posix线程编程,比如《UNIX环境高级编程(第二版)》、《UNIX系统编程》等等。 linux的消息属于IPC,也就是进程间通信,线程用不上。 linux用pthread_kill对线程发信号。 另:windows下不是用post..(你是说PostMessage吗?)进行线程通信的吧? windows用PostThreadMessage进行线程间通信,但实际上极少用这种方法。还是利用同步多一些 LINUX下的同步和Windows原理都是一样的。不过Linux下的singal中断也很好用。 用好信号量,共享资源就可以了。 使用多线程的理由之一是和进程相比,它是一种非常"节俭"的多任务操作方式。我们知道,在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式

python多线程和GIL全局解释器锁

让人想犯罪 __ 提交于 2020-03-16 06:36:55
1、线程 线程被称为轻量级进程,是最小执行单元,系统调度的单位。线程切换需要的资源一般,效率一般。 2、多线程 在单个程序中同时运行多个线程完成不同的工作,称为多线程 3、并发: 操作系统同时执行几个程序,这几个程序都由一个cpu处理,但在一个时刻点上只有一个程序在cpu上处理 4、并行: 操作系统同时执行2个程序,但是有两个cpu,每个cpu处理一个程序,叫并行 5、串行: 是指的我们从事某项工作是一个步骤一个步骤去实施 一、多线程 #python3是假的多线程,它不是真真正正的并行,其实就是串行,只不过利用了cpu上下文的切换而已 1 mport threading 2 import time 3 # def test1(): 4 # for i in range(10): 5 # time.sleep(1) #睡1s 6 # print('test1=========>%s' % i) 7 # 8 # 9 # def test2(): 10 # for i in range(10): 11 # time.sleep(1) 12 # print('test2=========>%s' % i) 13 # 14 # t1 = threading.Thread(target=test1) #定义一个线程 target=函数名 15 # t2 = threading.Thread

阻塞,非阻塞,同步,异步

為{幸葍}努か 提交于 2020-03-16 06:28:15
先说说阻塞与非阻塞,这主要和程序等待消息时的状态有关 1、阻塞 程序会阻塞在某一个函数,而不往下执行,就如挂在那里一样,所有的其他业务也都不执行,为一直等到消息到来才往下执行。 2、非阻塞 程序不会阻塞在某一个函数,不等待消息到来,立即返回,往下执行。 举个例子,TCP协议中的send,系统会为其分配一块发送缓存区,假设现在总的缓存 区的大小为1000.,而缓存区里已经有了500个数据,这时调用send,发送1000个字节数据,这时如果在阻塞模式下,send的会先最多的数据放入缓存,直到缓存区满,然后程序就会阻塞在那里,一直等到将所有数据全部发出去为止,而如果在非阻塞模式下,send的会先将最多的数据放入缓存之后,就马上返回,剩余数据下回接着发送,不会卡在send函数中。 同步和异步这两个概念,其实是与消息通知机制有关的。 1、同步 发送消息,等待消息处理完后,才往下执行。就如MFC里的SendMessage(), 2、异步 发送消息,不等待消息处理完,就往下执行,让后通过特定的接口或者事件,消息通知你事情完成了。如MFC里的PostMessage() 粗略的讲了一下以上的两个概念,估计大家会问,那么阻塞与同步,非阻塞与异步有啥区别,用例说明。 比如我们现在去银行,你可以选择两种方式,取票等待和排队等待,如果你排队等待,你就得等前面所有人都办理完了,才能办理业务

如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例

二次信任 提交于 2020-03-16 02:26:09
wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。 在 Java 中可以用 wait、notify 和 notifyAll 来实现线程间的通信。。举个例子,如果你的Java程序中有两个线程——即生产者和消费者,那么生产者可以通知消费者,让消费者开始消耗数据,因为队列缓冲区中有内容待消费(不为空)。相应的,消费者可以通知生产者可以开始生成更多的数据,因为当它消耗掉某些数据后缓冲区不再为满。 我们可以利用wait()来让一个线程在某些条件下暂停运行。例如,在生产者消费者模型中,生产者线程在缓冲区为满的时候,消费者在缓冲区为空的时候,都应该暂停运行。如果某些线程在等待某些条件触发,那当那些条件为真时,你可以用 notify 和 notifyAll 来通知那些等待中的线程重新开始运行。不同之处在于,notify 仅仅通知一个线程,并且我们不知道哪个线程会收到通知,然而 notifyAll 会通知所有等待中的线程。换言之,如果只有一个线程在等待一个信号灯,notify和notifyAll都会通知到这个线程。但如果多个线程在等待这个信号灯,那么notify只会通知到其中一个,而其它线程并不会收到任何通知,而notifyAll会唤醒所有等待中的线程。 在这篇文章中你将会学到如何使用

JVM系列八(虚拟机性能监控命令).

醉酒当歌 提交于 2020-03-15 23:26:33
jps JVM Process Status Tool,显示指定系统内所有的 HotSpot 虚拟机进程。显示信息包括虚拟机执行主类名称以及这些进程的本地虚拟机唯一ID(Local Virtual Machine Identifier,LVMID)。 jps [-q] [-mlvV] [<hostid>] 选项 作用 -q 只输出 LVMID,省略主类的名称 -m 输出虚拟机进程启动时传递给主类 main() 函数的参数 -l 输出主类的名称,如果进程执行的是 jar 包,输出 jar 路径 -v 输出虚拟机进程启动时 JVM 参数 jstat JVM Statistics Monitoring Tool,用于收集 HotSpot 虚拟机各方面的运行数据。包括显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT 编码等运行数据。 jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]] 参数 interval 和 count 代表查询间隔和次数,如果省略这两个参数,说明只查询一次。 选项 作用 -class 监视类装载、卸载数量、总空间以及类装载所耗费的时间 -compiler 输出 JIT 编译过的方法、耗时等信息 -printcompilation 输出已经被 JIT 编译的方法 -gc 监视 Java

《【面试突击】— Redis篇》-- Redis的线程模型了解吗?为啥单线程效率还这么高?

房东的猫 提交于 2020-03-15 20:52:16
原文: 《【面试突击】— Redis篇》-- Redis的线程模型了解吗?为啥单线程效率还这么高? 能坚持别人不能坚持的,才能拥有别人未曾拥有的。 关注 编程大道 公众号,让我们一同坚持心中所想,一起成长!! 《【面试突击】— Redis篇》-- Redis的线程模型了解吗?为啥单线程效率还这么高? 在这个系列里,我会整理一些面试题与大家分享,帮助年后和我一样想要在金三银四准备跳槽的同学。 我们一起巩固、突击面试官常问的一些面试题,加油!! 1、面试题 Redis和Memcached有什么区别? Redis的线程模型是什么? 为什么Redis是单线程的但是还可以支撑高并发? 2、面试官心理分析 问这个的时候就是问你Redis的原理了,看你是不是思考过,研究过。Redis最基本的一个内部原理和特点,就是Redis实际上是个单线程工作模型。你要是连这个都不知道,那后面在使用Redis的时候,如果出了问题岂不是什么都不知道,无从下手? 还有可能面试官会问问你Redis和Memcached的区别。不过说实话,近几年,面试官都不太喜欢这么问了。因为memcached是早些年各大互联网公司常用的缓存方案,但是现在近几年基本都是Redis,没什么公司用memcached了。 3、温馨提醒 如果你要是现在还不知道redis和memcached是啥

javascript:Web Worker

五迷三道 提交于 2020-03-15 20:39:55
原文章: https://wangdoc.com/javascript/index.html Web Worker 概述 JavaScript 语言采用的是单线程模型,也就是说,所有任务只能在一个线程上完成,一次只能做一件事。前面的任务没做完,后面的任务只能等着。随着电脑计算能力的增强,尤其是多核 CPU 的出现,单线程带来很大的不便,无法充分发挥计算机的计算能力。 Web Worker 的作用,就是为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行。在主线程运行的同时,Worker 线程在后台运行,两者互不干扰。等到 Worker 线程完成计算任务,再把结果返回给主线程。这样的好处是,一些计算密集型或高延迟的任务可以交由 Worker 线程执行,主线程(通常负责 UI 交互)能够保持流畅,不会被阻塞或拖慢。 Worker 线程一旦新建成功,就会始终运行,不会被主线程上的活动(比如用户点击按钮、提交表单)打断。这样有利于随时响应主线程的通信。但是,这也造成了 Worker 比较耗费资源,不应该过度使用,而且一旦使用完毕,就应该关闭。 Web Worker 有以下几个使用注意点。 (1) 同源限制 分配给 Worker 线程运行的脚本文件,必须与主线程的脚本文件同源。 (2) DOM 限制 Worker 线程所在的全局对象

java学习笔记--控制线程运行

巧了我就是萌 提交于 2020-03-15 19:11:25
线程的控制很常见,如文件传送到一半时,需要暂停文件传送,或终止文件传送,这实际上就是控制线程的运行。 线程有创建、可运行、运行中、阻塞、死亡5个状态。 创建:使用new运算符创建一个线程 可运行:使用start方法启动一个线程后,系统分配了资源 运行中状态:执行线程的run方法 阻塞:运行的线程因为某种原因停止继续运行 死亡状态:线程结束 传统方法的安全问题 Thread的stop(),suspend(),resume(),destroy()方法,因为不安全,可能造成死锁,已经不再使用了。 如何控制线程的运行 举个例子,假如某个文件的传输需要10s,让其传输到某个时刻暂停传输,然后继续,到传完为止。使用实现Runnable的方法完成,首先是文件传输的Runnable类 代码如下: public class ThreadControlTest1 implements Runnable { private int percent = 0; public void run() { while(true) { System.out.println("传送进度:"+ percent +"%"); try { Thread.sleep(1000); } catch(Exception ex) {} percent += 10; if(percent == 100) { System.out

《Windows via C/C++》学习笔记 —— 线程基础

徘徊边缘 提交于 2020-03-15 19:08:27
  每个进程都有一个主线程。每个线程都包含2个部分: 1、一个内核对象,操作用此来管理线程,里面包含了线程的状态; 2、一个线程堆栈,用来维护所有的函数参数和局部变量。   启动线程,需要提供一个线程入口函数,该函数原形必须为如下形式: DWORD WINAPI ThreadFunc(PVOID pvParam) { DWORD dwRet = 0 ; return dwRet; }   在这个函数里,你的线程执行相关任务,当该函数返回时,线程便停止了运行。线程堆栈也被清除,线程内核对象的引用计数减1。   你可以使用CreateThread函数创建一个线程,该函数返回一个线程内核对象句柄。   结束一个线程有4中方法: 1、线程函数返回 2、线程自己调用ExitThread函数终止自己运行 3、本进程内的其他线程或该线程自己调用TerminateThread函数指定终止一个进程 4、包含该线程的进程终止   应该尽量使用第1种方法,确保线程终止的时候所有资源可以被系统正确地回收。   线程内核对象中维护了一些数据结构,包括一个反应该线程最近运行情况的上下文内容“CONTEXT”,里面有一些“CPU的寄存器信息”,主要包括一个SP和IP,分别保存了线程堆栈中的入口函数地址和NTDLL.dll中的RtlUserThreadStart函数地址,该函数用来执行线程代码

如何在新线程中运行一小段代码?

蹲街弑〆低调 提交于 2020-03-15 18:39:11
我有一些代码需要在与GUI不同的线程中运行,因为它当前导致表单在代码运行时冻结(10秒左右)。 假设我以前从未创建过新的线程; 什么是如何在C#中使用.NET Framework 2.0或更高版本执行此操作的简单/基本示例? #1楼 如果你想得到一个值: var someValue; Thread thread = new Thread(delegate() { //Do somthing and set your value someValue = "Hello World"; }); thread.Start(); while (thread.IsAlive) Application.DoEvents(); #2楼 Joe Albahari 是开始阅读的好地方。 如果你想创建自己的线程,这很简单: using System.Threading; new Thread(() => { Thread.CurrentThread.IsBackground = true; /* run your code here */ Console.WriteLine("Hello, world"); }).Start(); #3楼 这是另一种选择: Task.Run(()=>{ //Here is a new thread }); #4楼 尝试使用 BackgroundWorker 类。