c - 信号量队列

标签 c multithreading blocking semaphore system

我正在扩展信号量的功能。当我意识到我不知道实际信号量的实现并确保我的代码正确运行时,我遇到了障碍,我需要知道这一点。

我知道信号量的工作原理是阻塞正在等待它的线程,当它们调用 sem_wait() 而另一个线程当前已锁定它时。然后线程被阻塞,然后放入该信号量的等待列表中。

我的问题与 sem_post() 上发生的事情有关。下一个线程是否从等待列表中拉出,设置为锁定线程,并允许解除阻塞?还是发布方案完全不同?

谢谢!

最佳答案

sem_wait() 上解除阻塞的下一个线程将是操作系统决定的下一个上下文切换到的线程。没有人对订购做出任何保证;这取决于您的操作系统的调度策略。它可能是离开 CPU 时间最长的线程,或者被分配了最高“优先级”的线程,或者历史上具有特定资源使用统计信息的线程,等等。

您当前的线程(调用 sem_post() 的线程)很可能会继续运行一段时间,直到它开始等待用户输入、阻塞另一个信号量或用完它的操作系统分配的时间片。然后,操作系统将切换到一些完全不相关的进程中运行几分之一秒(可能是 Firefox 或其他东西),然后关闭并处理一些网络流量,给自己喝杯茶,最后,当它运行时根据过去的历史,选择它感觉像的其他线程中的任何一个。

在许多操作系统中,优先考虑的是尚未存在很长时间的 I/O 绑定(bind)进程。从理论上讲,新进程可能是短暂的(如果它已经存在了五个小时,它很可能不会在接下来的 1 毫秒内完成)所以我们不妨结束它们。受 I/O 限制的进程很可能会继续受 I/O 限制,这意味着它们很可能会在等待其他资源时很快关闭 CPU。基本上,操作系统希望找到可以尽快完成的进程,这样它就可以回去喝茶并运行恶意软件。

关于c - 信号量队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/679096/

相关文章:

c - 我的 fget 出现段错误?

c - 在 X11 上移动鼠标光标无法按预期工作

java - Tomcat-Servlet响应阻止-刷新问题

c - Memcpy 类型转换 C

c - 如果没有直接访问则包含 errno

c - 如何在arduino板上创建一种线程?

java - AsyncTask 和 Android 线程 : how to get it right ?

c++ - OpenThread() 返回 NULL Win32

android - Android 2.3 中的调用阻止

gpu - 在 OpenCL 上使用阻塞写入和 event.wait() 与非阻塞写入之间的区别