Frage

Ich habe eine Warteschlange mit einer Semaphore. Zu bestimmten Punkt alle Anrufe ‚Invalid argument‘ Fehler sem_post() immer wieder zurückkehren, obwohl die Semaphore selbst gültig ist

Die Semaphore ist ein privates Mitglied von C ++ Objekt, das nie gelöscht wird, kann es auch in GDB inspiziert werden. Ich habe sem_getvalue() kurz vor dem sem_post() - der Wert liest OK und dann scheitert es auf sem_post(). Was könnte falsch sein?

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);
    }
}
War es hilfreich?

Lösung

Was könnte falsch sein? Eine beliebige Anzahl von Dingen. Etwas anderes könnte die Semaphore werden zu zerstören oder das Überschreiben des verwendeten Speichers zu speichern oder um den Zeiger zu. Eine weitere Möglichkeit ist, dass Sie sem_post () zu oft und der Zähler überläuft sind aufgerufen wird. Ein Codebeispiel würde helfen.

Andere Tipps

Wir hatten das gleiche Problem, und nach einer langen Zeit, herauszufinden, was geschehen könnte, stellten wir fest, dass das Problem aufgetreten, weil das Semaphore innerhalb einer Struktur definiert wurde, das seine Byte-Ausrichtung (in diesem Fall mit dem Pragma auf 1 geändert hatte Pack (1) Richtlinie).

Die POSIX Semaphore Implementierung auf Linux verwendet die futex syscall. Nach der futex Mann Seite wird EINVAL zurückgegeben, wenn „eine Operation nicht in der Seitenausrichtung definiert wurde oder Fehler.“

In unserem Fall entweder das Entfernen des Pragma Pack (1) Richtlinie oder die Definition der Semaphore als erstes Element der Struktur, das Problem gelöst.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top