C 本例中应该创建什么任务?

C 本例中应该创建什么任务?,c,resources,real-time,semaphore,vxworks,C,Resources,Real Time,Semaphore,Vxworks,对于普通二进制信号量 正在尝试同步到的任务 外部事件创建一个空的 信号量…第二个任务 控制同步事件 当信号量为“否”时给出该信号量 需要更长的时间 我的问题是为什么我没有看到第一个任务创建空信号量,如前所述?(看起来它只是在主函数中“一般”完成的?“试图与外部事件同步的任务会创建一个空信号量”。 而且,我真的不明白第二个任务是如何“控制”同步的 多谢各位 请参阅:通过二进制信号量进行同步的示例 示例中有一个bug。initialize中的第一行应分配给syncExampleSem 第二个任务“控

对于普通二进制信号量 正在尝试同步到的任务 外部事件创建一个空的 信号量…第二个任务 控制同步事件 当信号量为“否”时给出该信号量 需要更长的时间

我的问题是为什么我没有看到第一个任务创建空信号量,如前所述?(看起来它只是在主函数中“一般”完成的?“试图与外部事件同步的任务会创建一个空信号量”。

而且,我真的不明白第二个任务是如何“控制”同步的

多谢各位

请参阅:通过二进制信号量进行同步的示例

示例中有一个bug。
initialize
中的第一行应分配给
syncExampleSem

第二个任务“控制”同步,因为在任务2“给出”信号量之前,任务1无法继续。信号量在哪里创建并不重要,只要它保证在任何一个任务尝试给予或接受它之前创建


由于这些特定任务是并行运行的,因此它是在
initialize
中创建的,因为如果它是由task 2创建的,则会有task 1在信号量存在之前等待信号量的风险,反之亦然,如果它是由task 1创建的,则会有task 2在信号量存在之前给出信号量的风险。

示例中有一个错误。
initialize
中的第一行应分配给
syncExampleSem

第二个任务“控制”同步,因为在任务2“给出”信号量之前,任务1无法继续。信号量在哪里创建并不重要,只要它保证在任何一个任务尝试给予或接受它之前创建


由于这些特定任务是并行运行的,因此它是在
initialize
中创建的,因为如果它是由任务2创建的,则任务1可能会在信号量存在之前等待它,反之亦然,如果它是由任务1创建的,则任务2可能会在信号量存在之前给出信号量。

SemTake和SemGive返回错误(因为信号量不存在)。
检查系统调用的返回代码很有价值。

SemTake和SemGive返回错误(因为信号量不存在)。
检查系统调用的返回码是很有价值的。

我也在想第一行,谢谢。关于在任务1或2中创建的信号量,我看到了您描述的问题。这是否意味着本例中的措辞是错误的,还是我看得不对?与代码相比,本例的措辞很糟糕。根据我的经验,信号量几乎总是在使用它们的任务之外初始化的,除非你有一个特殊的情况,比如一个任务从另一个任务中派生出来。我也很想知道第一行,谢谢。关于在任务1或2中创建的信号量,我看到了您描述的问题。这是否意味着本例中的措辞是错误的,还是我看得不对?与代码相比,本例的措辞很糟糕。根据我的经验,信号量几乎总是在使用它们的任务之外初始化,除非您有一种特殊情况,比如一个任务从另一个任务中派生出来。
#include "vxWorks.h"
#include "semLib.h"

#define T_PRIORITY 50


SEM_ID syncExampleSem;    // named semaphore object

void initialize (void)
{

    // set up FIFO queue with emtpy binary semaphore

syncSem = semBCreate (SEM_Q_FIFO, SEM_EMPTY);

    // create task1
    taskSpawn ("task1", T_PRIORITY, 0, 10000, task1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

    // create task2
    taskSpawn ("task2", T_PRIORITY, 0, 10000, task2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

}

void task1 (void)
{
    // stay here until semaphore becomes available
    semTake (syncExampleSem, WAIT_FOREVER);


    // do something

}



void task2 (void)
{
    // do something



    // now let task1 execute
    semGive (synExampleSem);

}