在信号处理程序中使用sem_post()是否依赖于未定义的行为?
/*
* excerpted from the 2017-09-15 Linux man page for sem_wait(3)
* http://man7.org/linux/man-pages/man3/sem_wait.3.html
*/
...
sem_t sem;
...
static void
handler(int sig)
{
write(STDOUT_FILENO, "sem_post() from handler\n", 24);
if (sem_post(&
我有一个简单的套接字服务器,它是在linux和Windows上用C实现的,我很难完全关闭它。
它创建一个套接字,绑定它,然后调用listen。然后,它使用select循环检测新的连接,并在任何当前连接的客户端套接字上执行读取活动。客户端关闭套接字是很好的,它唤醒了select,但我遇到的问题是干净利落地关闭循环。我天真地从另一个线程或响应信号或Ctrl-C关闭了服务器套接字(我正在侦听和接受的套接字),但这无法唤醒select,这让我感到惊讶。
如果有必要,我可以使用self管道技巧来等待select up (创建一个fifo并将读取端也包括在select列表中,然后在我想关闭时写入它),但考
我的多线程代码中有很多自旋锁,大多数时候它们都在等待其他线程工作,因此占用了大量的cpu资源。在linux中,我通常使用pthread_cond_wait和pthread_cond_signal来暂停线程,并在收到信号时唤醒线程。boost库中有这样的东西吗?我匆匆看了一眼,什么也没找到。
Visual studio 2005
我正在开发一个Linux应用程序,它需要能够处理大量的信号。尽管信号处理程序将运行得很快(我最多计划了数千个cpu周期),但信号将以大突发的形式出现,理想情况下,我将完全禁用信号掩蔽(即使不是主题,参见SA_NODEFER in )。
因此,我需要以完全可重入的方式实现信号处理程序。我认为std::原子对这个任务是有用的,但是我认为,std::原子是为了处理基于线程的争用条件而开发的,而不一定是从信号处理程序堆叠而来的争用问题。
在单线程程序中,信号处理程序中是否可能存在竞争条件?
void signal_handler(...)
{
static int i = 0;
i = i + 10 * 10;
}
假设抛出了两个非常接近的信号,如此接近,以至于它们同时进入函数。
我找不到有关最新的Linux操作系统如何处理此问题的信息。我只知道这两个信号都被正确处理了,但我不知道如何处理。竞争条件是可能的吗?
感谢您的帮助,谢谢!
在x86 (64位或32位) Linux上--例如:
void signal_handler(int) {
// want to know where the program is interrupted ...
}
int main() {
...
signal(SIGALRM, signal_handler);
alarm(5);
...
printf(...); <------- at this point, we trigger signal_handler
...
}
在signal_handler中,我们如何知道在mai