【问题标题】:UNIX/OSX version of semtimedopUNIX/OSX 版本的 semitimedop
【发布时间】:2010-11-27 04:03:01
【问题描述】:

GLibC 有一个方法 semtimedop,它允许您执行在一定时间后超时的操作(在这种情况下为信号量获取)。 Win32 还提供了WaitForSingleObject,提供了类似的功能。

据我所知,在 OSX 或其他 Unices 上没有等价物。您能否建议 semtimedop 的等效项或在一定时间后干净地终止 semop 的解决方法。

【问题讨论】:

    标签: c++ c macos unix semaphore


    【解决方案1】:

    您可以通过获取信号(例如由alarm() 引起的信号)来中断semop() 调用(以及大多数其他阻塞调用)。

    未经测试的示例:

    #include <signal.h>
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/ipc.h>
    #include <sys/sem.h>
    
    volatile int alarm_triggered = 0;
    void alarm_handler(int sig)
    {
        alarm_triggered = 1;
    }
    
    int main(int argc, char **argv)
    {
        int rc;
        /* set up signal handler */
        signal(SIGALRM, alarm_handler);
    
        /* ... */
        alarm(30); /* 30 second timeout */
        rc = semop(...);
        if (rc == -1 && errno == EINTR)
        {
            if (alarm_triggered)
            {
                /* timed out! */
            }
        }
        alarm(0); /* disable alarm */
        /* ... */
    }
    

    【讨论】:

    • Windows 上也可以使用警报呼叫吗?
    • 不,alarm() 是一个 POSIX 调用,我认为 Windows 不支持信号的概念。 (顺便说一句,我编辑了我的答案,实际上是写成两个独立的部分)
    • 谢谢。此外,pthreads 的东西没有用,因为它不是内核级的信号量,所以不能跨进程工作。
    • 没错,我会删除答案的第二部分
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 2010-12-20
    • 2016-10-13
    • 1970-01-01
    相关资源
    最近更新 更多