在执行过程中睡一根线
sleeping a thread in the middle of execution
当一个线程在执行过程中被其他线程(可能由主线程)置于sleep
时会发生什么?
假设我有一个函数Producer
.如果生产者Consumer
sleep()
在一个单元的生产中间怎么办?
假设该单元生产了一半,然后将其置于睡眠状态()。系统的完整性可能有问题
sleep
的线程由线程调度程序放入空闲队列中,并从运行它的 CPU 中切换出上下文,以便其他线程可以取代它的位置。
所有上下文(寄存器、堆栈指针、基指针等)都保存在线程堆栈上,因此下次运行时,它可以从中断的位置继续。
操作系统不断在线程之间进行上下文切换,以使系统看起来像是在做多件事。 操作系统线程调度程序算法会处理这个问题。
线程调度和线程是一个很大的主题,如果你想真正理解它,我建议你开始阅读它。 :)
编辑:不建议将sleep
用于线程同步目的,您应该使用适当的同步机制来告诉线程等待其他线程等。
没有与此相关的问题,除非在线程休眠时某些状态发生突变,因此它唤醒时的值集与进入睡眠状态之前不同。
线程始终由 CPU 切换为执行和退出执行,但这不会影响其执行的整体结果,前提是不存在数据争用或其他错误。
一个线程强制和同步干扰另一个线程的执行是不可取的。一个线程可以向另一个线程发送异步消息,请求它以某种方式重新调度自己,但当另一个线程处于合适的状态时,这将由另一个线程处理。
假设它们使用线程安全的通道进行通信,则不会发生任何坏事,因为休眠线程最终会唤醒并从其任务队列中获取数据,或者看到已设置了一些信号量并读取了生产的数据。
如果线程使用非易失性变量或更改状态的直接函数调用进行通信,那就是坏事发生的时候。
一个线程强制导致另一个线程休眠的方法。如果两个线程正在访问共享资源(如输入/输出队列,对于您的 Produce/Consumer 示例来说似乎很可能),则两个线程可能会争用同一个锁。如果争用不是"trylock"品种,则失败的线程必须等待另一个线程释放锁。等待的线程被放入与锁关联的等待队列中,并从调度程序运行队列中删除。当获胜线程释放锁时,代码会检查队列以查看是否有线程仍在等待获取它。如果有,则选择一个作为获胜者并被授予锁,并放置在调度程序运行队列中。
- 找到一种有效的方法,在 2 个巨大的缓冲区上执行 MAX,每字节字节
- CMake:我们可以为一组不形成可执行文件或库的特定文件指定包含目录吗?
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 为什么我的信号处理程序只执行一次?
- 在另一台 PC 上执行程序时加载 SDL2 共享库时出错
- 为什么我的 cout 一次执行,尽管 cin 应该在两者之间读取?
- Av_read_pause和av_read_play挂了一根线
- 使用增强灵气解析一根细弦
- C 求解四分之一根(第四阶多项式)
- 我可以用另一根线冲洗我的蒸汽吗
- 在执行过程中睡一根线
- 在一根奇怪的绳子上排列
- ".exe has stopped working"当我尝试串起一根绳子时
- 调用从上一次执行中保存的函数指针会失败吗
- 投掷和抓住一根绳子
- 一次执行后,嵌套for循环出现意外/未见的中断:高斯消去
- 有可能弄断一根纺线吗?
- 如何比较一根绳子和一根_T("some String")?
- 为什么我不能做一根绳子
- 如何从一组中取出一根弦