
多线程编程
道亦无名
王阳明曰: 立志 勤学 改过 择善
我曰: flag practice debug release
展开
-
在超线程CPU上切换到另一个线程
当需要从一个线程切换到另一个线程时,CPU会进行一系列的操作来确保线程之间的顺利切换。这不仅可以提高CPU的利用率,还可以减少线程切换带来的开销,从而提高整个系统的性能。这个过程包括保存当前线程的状态,例如寄存器的值、程序计数器等,以便之后可以恢复该线程的执行。需要注意的是,线程切换是一个复杂的过程,涉及到操作系统的调度算法、CPU的硬件支持以及线程之间的同步和通信等多个方面。然后,CPU会选择另一个线程来执行。一旦选定了要执行的线程,CPU会将其上下文从内存中加载回寄存器,并恢复该线程的执行状态。原创 2024-06-21 07:31:54 · 439 阅读 · 0 评论 -
自旋锁的特点
这种机制意味着持有锁的线程必须尽快释放锁,以避免其他等待的线程持续消耗CPU资源。自旋锁是一种特殊的锁机制,当一个线程尝试获取一个已经被其他线程持有的自旋锁时,它不会立即阻塞或放弃CPU的使用权,而是会持续进行忙等待(busy-waiting),也就是在一个循环中检查锁是否可用。如果确实需要递归锁的行为,应该考虑使用其他类型的锁,如递归互斥锁(recursive mutex),这种锁允许同一个线程多次获取锁,但每次获取都需要相应的释放操作。在需要递归锁的场景中,应该使用支持递归特性的锁,如递归互斥锁。原创 2024-05-29 20:19:30 · 540 阅读 · 0 评论 -
使用强制性的手段来结束一个进程
VOID ExitThread(DWORD dwExitCode);dwExitCode 指定此线程之结束代码没有返回值这函数有点像C runtime library中的exit()函数,因为他可以在任何时候调用并且绝不会返回。任何代码若放在此行之下,保证不会被执行。#define WIN32_LEAN_AND_MEAN#include #include #inc原创 2014-12-20 20:30:07 · 3055 阅读 · 0 评论 -
Linux中的fork()函数
Linux通过clone()系统调用实现fork()。这个调用通过一系列的参数标志来指明父、子进程需要共享的资源。fork()、vfork()和__clone()库函数都根据各自需要的参数标志去调用clone()。然后由clone()去调用do_fork()。 do_fork()完成了创建中的大部分工作,他的定义在kernel/fork.c文件中。该函数调用copy_process()函数原创 2015-12-12 18:25:07 · 3713 阅读 · 0 评论 -
vfork()函数
Linux通过系统调用和fork()的功能相同,除了不拷贝父进程的页表项。子进程作为父进程的一个单独的线程在它的地址空间里运行,父进程被阻塞,直到子进程退出或执行exec()。子进程不能向地址空间写入。在过去的3BSD时期,这个优化是很有意义的,那时并未使用写时拷贝也来实现fork()。现在由于在执行fork()是引入了写时拷贝页表项了。如果Linux将来fork()有了写拷贝页表项,那么vfor原创 2015-12-14 19:15:11 · 3181 阅读 · 0 评论