Какую задачу предполагается создать в этом примере?

Для обычного двоичного семафора задача, пытающаяся синхронизироваться с внешним событием, создает пустой семафор... Вторая задача, управляющая событием синхронизации, отдает семафор, когда он больше не нужен.

#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);

} 

Мой вопрос: почему я не вижу первую задачу, создающую пустой семафор, как описано? (Похоже, что это делается "в общем" в функции main?) "задача, пытающаяся синхронизироваться с внешним событием, создает пустой семафор".

Кроме того, я не очень понимаю, как вторая задача «контролирует» синхронизацию?

Спасибо.

См.: Пример синхронизации через двоичный семафор
http://www.cross-comp.com/instr/pages/embedded/VxWorksTutorial.aspx#VxWorks%20Programming


person T.T.T.    schedule 06.01.2011    source источник


Ответы (2)


В примере есть ошибка. Первая строка в initialize должна быть назначена syncExampleSem.

Вторая задача «управляет» синхронизацией, потому что задача 1 не может продолжаться до тех пор, пока задача 2 не «отдаст» семафор. На самом деле не имеет значения, где создается семафор, если он гарантированно будет создан до того, как какая-либо задача попытается либо дать, либо взять его.

Поскольку эти конкретные задачи выполняются параллельно, он создается в initialize, потому что, если он был создан задачей 2, вы рискуете тем, что задача 1 будет ожидать на семафоре до того, как он будет создан, и наоборот, если он создан задачей 1, вы запускаете риск того, что задача 2 даст семафор до того, как он существует.

person Karl Bielefeldt    schedule 06.01.2011
comment
Я тоже думал об этой первой строке, спасибо. Что касается семафора, создаваемого в задаче 1 или 2, я вижу проблему, которую вы описали. Означает ли это, что формулировка в этом примере неверна, или я неправильно смотрю на это? - person T.T.T.; 07.01.2011
comment
Пример сформулирован плохо по сравнению с кодом. По моему опыту, семафоры почти всегда инициализируются вне задач, которые их используют, если только у вас нет особой ситуации, например, одна задача порождается внутри другой. - person Karl Bielefeldt; 07.01.2011

SemTake и SemGive возвращают ошибки (поскольку семафор не существует). Полезно проверять коды возврата системных вызовов.

person fanch    schedule 01.04.2011