sem_post () не работает с допустимым семафором - PullRequest
1 голос
/ 26 марта 2009

У меня есть очередь с семафором. В определенный момент все вызовы sem_post() всегда возвращают ошибку «Неверный аргумент», хотя сам семафор действителен

Семафор - это закрытый член объекта C ++, который никогда не удаляется, его также можно проверить в gdb. Я добавил sem_getvalue() как раз перед sem_post() - значение читается как ОК, а затем происходит сбой sem_post(). Что может быть не так?

CThreadQueue::CThreadQueue(int MaxSize) :
    _MaxSize(MaxSize)
{
    sem_init(&_TaskCount, 0, 0)

    pthread_mutex_init(&_Mutex, 0);
    pthread_create(&_Thread, NULL, CThreadQueue::StartThread, this);
}


CThreadQueue::~CThreadQueue()
{
    pthread_kill(_Thread, SIGKILL);
    sem_destroy(&_TaskCount);
}


int CThreadQueue::AddTask(CThreadTask Task)
{
    pthread_mutex_lock(&_Mutex);
    _Queue.push_back(TempTask);
    sem_post(&_TaskCount)
    pthread_mutex_unlock(&_Mutex);

    return 0;
}

void *CThreadQueue::StartThread(void *Obj)
{
    ((CThreadQueue*)Obj)->RunThread();
    return NULL;
}

//runs in a separate thread
void CThreadQueue::RunThread()
{
    CThreadQueue::CTask Task;

    while(1) {
        sem_wait(&_TaskCount);
        pthread_mutex_lock(&_Mutex);

        Task = _Queue.front();
        _Queue.pop_front();

        pthread_mutex_unlock(&_Mutex);

        if (Task.Callee != NULL)
            Task.Callee->CallBackFunc(NULL, Task.CallParam);
    }
}

Ответы [ 2 ]

1 голос
/ 30 марта 2011

У нас была та же проблема, и после долгого выяснения того, что могло бы произойти, мы обнаружили, что проблема возникла, потому что семафор был определен внутри структуры, у которой его байтовое выравнивание было изменено на 1 (в этом случае, используя прагму Директива pack (1)).

Реализация семафоров POSIX в Linux использует системный вызов futex. Согласно справочной странице futex, EINVAL возвращается, когда «не была определена операция или произошла ошибка при выравнивании страницы».

В нашем случае, либо удаление директивы pragma pack (1), либо определение семафора в качестве первого элемента структуры, решило проблему.

1 голос
/ 26 марта 2009

Что может быть не так? Любое количество вещей. Что-то еще может разрушить семафор или перезаписать память, используемую для его хранения, или указатель на него. Другая возможность состоит в том, что вы вызываете sem_post () слишком много раз, и счетчик переполняется. Пример кода поможет.

...