linux 线程 消息?linux创建线程
大家好,关于linux 线程 消息很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于linux创建线程的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!
多线程是什么意思
线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,
即不同的线程可以执行同样的函数。
什么是多线程?
多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,
也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。
多线程的好处:
可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,
这样就大大提高了程序的效率。
多线程与单线程的区别
生活举例
你早上上班,正要打卡的时候,手机响了。你如果先接了电话,等接完了,在打卡,就是单线程。
如果你一手接电话,一手打卡。就是多线程。
2件事的结果是一样的。你接了电话且打了卡。
Windows窗口与消息:计时器
计时器简述
应用使用计时器来在指定时间过去后安排事件的发生。每当给计时器指定的一个时间区间过去后,系统会给和计时器关联的窗口发送通知。因为计时器的精确度依赖于系统时钟精度和应用从消息队列检索消息的频率,计时器的时间区间只能看作一个粗略值。
计时器的操纵
应用可以使用 SetTimer函数创建计时器。计时器一创建就开始计时。应用可以使用 SetTimer来修改计时器的时间间隔值,可以使用 KillTimer销毁一个计时器。
每个计时器都有一个唯一的标识符。当创建计时器时,应用可以指定一个标识符,也可以让系统创造一个唯一值。 WM_TIMER消息包含了计时器的标识符。
如果在调用SetTimer时指定了窗口句柄,应用会将计时器与窗口关联起来。当过去一个计时器时间区间后,系统会向与计时器关联的窗口投递一个 WM_TIMER消息。如果没有指定窗口句柄,创建计时器的应用必须在消息队列中监视 WM_TIMER消息并派发到合适的窗口。如果你指定了 TimerProc回调函数,默认窗口过程会在接收到 WM_TIMER消息时调用回调函数来处理它。因此,你需要在主调线程中派发消息,即便在你使用 TimerProc而不是在窗口过程中处理它。
WM_TIMER消息
当计时器经过给定时间后,会发送到线程的消息队列。
wParam是计时器标识符,lParam是在计时器安装时,传递给 SetTimer的应用定义的回调函数的函数指针。
如果应用处理了该消息,窗口过程应该返回 0。
WM_TIMER消息优先级很低。GetMessage和 PeekMessage仅在队列中没有其他高优先级消息时才会投递该消息。
WM_TIMER不会连续在消息队列中添加多个,Windows会把多个 WM_TIMER消息合成为一个。
计时器过程(TimerProc)
函数的原型如下:
Arg1是与计时器关联的窗口句柄
Arg2是 WM_TIMER消息标识符值
Arg3是计时器标识符
Arg4是系统启动后过去的时间,以毫秒为单位。这个值由 GetTickCount函数返回。
该函数不需要返回值。
代码示例:随机矩形
Programming Windows中有一个有趣的例子:在用户区上绘制各种颜色的随机矩形。在书中作者使用的是无阻塞的 PeekMessage完成的操作,此处也可以使用计时器。
为了能够控制矩形的生成,可以使用鼠标消息,单击左键开始生成随机矩形,单击右键使其停止。
以下代码在 VS2019下通过编译并顺利测试。
首先,在 VS中创建一个标准桌面应用项目。然后在源文件的最上方加上计时器过程的声明,以及计时器标识符的宏:
在 WndProc函数头加上一个静态变量,记录计时器是否已创建:
在 WndProc的 switch语句块中加入鼠标消息的处理代码:(这里让计时器每秒计时大约 30次)
接下来可以编写计时器处理过程了,随机矩形的尺寸由 rand函数得到:
运行并按下鼠标左键,即可看到各种颜色的小矩形。按下右键可使矩形停止显示。
高精度计时器
计数器(counter)是一个编程中普遍使用的术语,它指一个增长的变量。一些系统包括了一个高精度性能计数器,它提供高精度的计时。
如果高精度性能计数器存在于系统中,你可以使用 QueryPerformanceFrequency函数来表达频率,以赫兹为单位。计时器的值是依赖于处理器的。例如,在某些处理器上,计数可能是处理器时钟的循环速率。
QueryPerformanceCounter函数会检索当前高精度性能计数器的值。通过在一段代码的开头和结尾调用这个函数,应用可以把计数器当作高精度计时器使用。例如,假设 QueryPerformanceFrequency表明计数器的频率为 50000 Hz。如果在需要计时的代码块头和尾立即调用 QueryPerformanceCounter,计数器的值可能是 1500个计数和 3500个计数。这些值就表示过去了 0.4秒(2000个计数)。
C标准库中的包含了一系列的时间函数。time函数返回基于 UNIX时间的当前时间,clock函数返回程序消耗的处理器时间。通过 clock函数可以粗略的测试某段代码运行的时间。
在 WSL1上使用gcc-o 1.out 1.c编译并运行,得到的时间是 6265625,Linux上 clock_t的时间单位好像是微秒。(加上-O1优化得到 1218750)
在 VS2019上编译并运行,得到的时间是7002(再优化一下直接变成 0了,把空循环优化没了XD)。
自然,这里可以是用上面提到的两个 API。
编译并运行,在我的电脑上的结果为7.014975。
可等(Waitable)计时器对象
可等计时器对象是一个同步对象,当指定时间到来时,它的状态被设置为发送信号。可以创建的可等计时器类型有两种:手动复位和同步。任一类型的计时器也可作为定期计时器(periodic timer)。
线程使用 CreateWaitableTimer或 CreateWaitableTimerEx来创建一个计时器对象。创建计时器的线程对计时器的类型进行指定。线程可以为计时器对象指定一个名字。其他进程中的线程可以通过在 OpenWaitableTimer函数调用中指定名字,来打开一个已存在计时器的句柄。任何带有计时器对象的句柄的线程可以使用一个等待函数来等待计时器的状态被设置为信号发送。
更多关于使用等待计时器用于线程同步的信息,可见于 Waitable Timer Objects。
linux线程查询指令linux线程查询
怎么在linux系统下查看网卡状态信息?
方法一:
ethtooleth0采用此命令可以查看到网卡相关的技术指标。
(不一定所有网卡都支持此命令)
ethtool-ieth1加上-i参数查看网卡驱动。
可以尝试其它参数查看网卡相关技术参数。
方法二:
也可以通过dmesg|grepeth0等看到网卡名字(厂家)等信息。
通过查看/etc/sysconfig/network-scripts/ifcfg-eth0可以看到当前的网卡配置包括IP、网关地址等信息。
当然也可以通过ifconfig命令查看。
Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。Linux操作系统诞生于1991年10月5日(这是第一次正式向外公布时间)。Linux存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。严格来讲,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU工程各种工具和数据库的操作系统。
linux查看活跃线程命令?
可以执行ps-ef进行查看
Linux多线程通信?
PIPE和FIFO用来实现进程间相互发送非常短小的、频率很高的消息;
这两种方式通常适用于两个进程间的通信。
共享内存用来实现进程间共享的、非常庞大的、读写操作频率很高的数据(配合信号量使用);
这种方式通常适用于多进程间通信。
其他考虑用socket。这里的“其他情况”,其实是今天主要会碰到的情况:
分布式开发。
在多进程、多线程、多模块所构成的今天最常见的分布式系统开发中,
socket是第一选择
。消息队列,现在建议不要使用了----因为找不到使用它们的理由。在实际中,我个人感觉,PIPE和FIFO可以偶尔使用下,共享内存都用的不多了。在效率上说,socket有包装数据和解包数据的过程,所以理论上来说socket是没有PIPE/FIFO快,不过现在计算机上真心不计较这么一点点速度损失的。你费劲纠结半天,不如我把socket设计好了,多插一块CPU来得更划算。另外,进程间通信的数据一般来说我们都会存入数据库的,这样万一某个进程突然死掉或者整个服务器死了,也不至于丢失重要数据、便于回滚到之前的状态。从这个角度考虑,适用共享内存的情况也更少了,所以socket使用得更多。再多说一点关于共享内存的:共享内存的效率确实高,但它的重点在“共享”二字上。如果的确有好些进程共享一大块数据(如果把每个进程都看做是类的对象的话,那么共享数据就是这个类的static数据成员),那么共享内存就是一个不二的选择了。但是在面向对象的今天,我们更多的时候是多线程+锁+线程间共享数据。因此共享进程在今天使用的也越来越少了。不过,在面对一些极度追求效率的需求时,共享内存就会成为唯一的选择,比如高频交易系统。除此以外,一般是不需要特意使用共享内存的。另外,
PIPE和共享内存是不能跨LAN的
(FIFO可以但FIFO只能用于两个进程通信)
。
如果你的分布式系统随着需求的增加而越来越大所以你想把不同的模块放在不同机器上而你之前开发的时候用了PIPE或者共享内存,那么你将不得不对代码进行大幅修改......同时,即使FIFO可以跨越LAN,其代码的可读性、易操作性和可移植性、适应性也远没有socket大。这也就是为什么一开始说socket是第一选择的原因。最后还有个信号简单说一下。
请注意,是信号,不是信号量。
信号量是用于同步线程间的对象的使用的(建议题主看我的答案,自认为比较通俗易懂:
semaphore和mutex的区别?-Linux-知乎
)。信号也是进程间通信的一种方式。比如在Linux系统下,一个进程正在执行时,你用键盘按Ctrl+c,就是给这个进程发送了一个信号。进程在捕捉到这个信号后会做相应的动作。虽然信号是可以自定义的,但这并不能改变信号的局限性:
不能跨LAN、信息量极其有限
。在现代的分布式系统中,通常都是
消息驱动:
即进程受到某个消息后,通过对消息的内容的分析然后做相应的动作。如果你把你的分布式系统设置成信号驱动的,这就表示你收到一个信号就要做一个动作而一个信号的本质其实就是一个数字而已。这样系统稍微大一点的话,系统将变得异常难以维护;甚至在很多时候,信号驱动是无法满足我们的需求的。因此现在我们一般也不用信号了。因此,请记住:
除非你有非常有说服力的理由,否则请用socket。
顺便给你推荐个基于socket的轻量级的消息库:ZeroMQ。
linux下,如何查看工控机的串口被哪个线程占用,能否使该线程强制释放串口?
在串口的驱动程序注册的open函数里加入这样一句话:printk("process%dhasopenttyn",current->pid);可以判断出来哪个进程打开了串口设备,或者是否有进程打开串口current->pid的值表示进程号!