Question

J'ai une file d'attente avec un sémaphores. À certain point tous les appels à sem_post() reviennent toujours « Invalid argument » erreur bien que le sémaphores lui-même est valide

Le sémaphore est membre privé de l'objet de C qui est jamais supprimé, il peut également être inspecté dans gdb. J'ai ajouté sem_getvalue() juste avant la sem_post() - la valeur OK apparaît alors il échoue sur sem_post(). Qu'est-ce qui pourrait être erroné?

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);
    }
}
Était-ce utile?

La solution

Qu'est-ce que peut-être tort? Un certain nombre de choses. Quelque chose d'autre pourrait être en train de détruire le sémaphores ou la mémoire utilisée écraser pour stocker ou le pointeur vers elle. Une autre possibilité est que vous appelez sem_post () trop de fois et les contre-trop-pleins. Un exemple de code serait utile.

Autres conseils

Nous avons eu le même problème, et après une longue période de déterminer ce qui pourrait se passer, nous avons découvert que le problème est survenu parce que le sémaphores a été défini à l'intérieur d'une structure qui a son alignement octet modifié à 1 (dans ce cas, en utilisant le pragma Pack (1) directive).

Le sémaphores POSIX implémentation sur Linux utilise le syscall futex. Selon la page de manuel de futex, EINVAL est renvoyée lorsque « Une opération n'a pas été définie ou une erreur dans l'alignement de la page. »

Dans notre cas, soit en retirant le bloc de pragma (1) ou directive définissant le sémaphore comme étant le premier élément de la structure, a résolu le problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top