【问题标题】:Wait & Signal order等待和信号订单
【发布时间】:2010-10-19 11:42:47
【问题描述】:

如果以下代码按照我放置的顺序执行,我能确定线程 1 先被线程 3 唤醒,然后再被线程 2 唤醒吗?

main:
sem_init(&x,0,0);

thread 1:
sem_wait(&x);

thread 2:
sem_wait(&x);

thread 3:
sem_post(&x);

【问题讨论】:

    标签: c pthreads semaphore


    【解决方案1】:

    没有理由做出这样的假设。这取决于线程 1 和线程 2 何时调用 sem_wait(),即取决于它们之前做了什么以及调度程序如何为它们提供 CPU 运行。如果您希望线程 1 在线程 2 之前被唤醒,则需要另一个信号量:

    main:
    sem_init(&x,0,0);
    sem_init(&y,0,0);
    
    thread 1:
    sem_wait(&x);
    sem_post(&y);
    
    thread 2:
    sem_wait(&y);
    
    thread 3:
    sem_post(&x);
    

    【讨论】:

    • 即使使用这段代码,人们也应该意识到,即使线程 1 在线程 2 之前变得可运行,仍然不一定保证它会被安排在线程 2 之前运行。如果线程 1 有工作需要在线程 2 运行之前执行,然后 sem_post(&y)(或等效项)需要由线程 1 完成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 2012-06-29
    相关资源
    最近更新 更多