【问题标题】:Semaphore Syncing信号量同步
【发布时间】:2010-10-19 09:48:40
【问题描述】:

我有两个信号量 x(最初为 1)和 y(最初为 0)。

我的线程函数代码是这样的:

...

wait(x);
   //setting some vars
signal(x);

wait(y);

...

我想确保线程等待y 排队,即。如果第一个线程首先完成了x-guarded 部分,它应该首先等待y,依此类推。在当前的实现中,signal(x); 之后发生的上下文切换可以防止这种情况发生。

有没有办法做到这一点,还是我必须完全重构代码以防止这种可能性?

【问题讨论】:

    标签: c pthreads semaphore


    【解决方案1】:

    不幸的是,信号量和所有其他 POSIX 锁定工具不允许设置优先级或类似的东西来控制它们的获取顺序。 (这不是一个错误,而是一个特性。-)

    完成您想要的任务的最简单方法是通过pthread_mutex_t 和相应的pthread_cond_t 保护状态变量。在状态变量中,您可以实现一个简单的时间戳来跟踪线程通过受保护部分的顺序。类似的东西

    struct state {
     pthread_mutex_t mutex;
     pthread_cond_t cond;
     size_t seen_at_x;
     size_t seen_at_y;
    };
    

    【讨论】:

      【解决方案2】:

      如果这对您很重要,那么您确实必须重构代码。

      据我所知,不能保证当信号量收到信号时,等待的进程会按照它们开始等待的顺序被唤醒。

      理想情况下,您的进程不应该关心它们到达同步点的顺序以及它们继续处理的顺序。

      【讨论】:

        【解决方案3】:

        我不知道这是否可行!它不允许取消线程同步/异步,但我不知道它是否适用于线程之间的上下文切换。试试看:

        pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL)
        

        当你完成它的最后一行之后:

        pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL)
        

        【讨论】:

          猜你喜欢
          • 2018-09-25
          • 2013-05-30
          • 1970-01-01
          • 2011-04-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多