Pregunta

Tengo una cola con un semáforo.En determinado momento todas las llamadas a sem_post() siempre volver a "argumento no Válido' error aunque el semáforo en sí es válida

El semáforo es un miembro privado de objetos de C++ que nunca se elimina, también puede ser inspeccionado en gdb.He añadido sem_getvalue() justo antes de la sem_post() - el valor que se lee en ACEPTAR y, a continuación, se produce un error en sem_post().Lo que podría estar equivocado?

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);
    }
}
¿Fue útil?

Solución

¿Qué podría estar mal? Cualquier número de cosas. Otra cosa que podría destruyendo el semáforo o sobrescribir la memoria utilizada para almacenar o el puntero a la misma. Otra posibilidad es que usted está llamando sem_post () demasiadas veces y los desbordamientos del contador. Un ejemplo de código ayudaría.

Otros consejos

Hemos tenido el mismo problema, y después de un largo tiempo de averiguar lo que podría estar sucediendo, descubrimos que el problema se produjo porque el semáforo estaba definido dentro de una estructura que tenía su byte de alineación cambia a 1 (en este caso el uso de la pragma pack(1) de la directiva).

Los semáforos POSIX aplicación en Linux utiliza la futex syscall.De acuerdo a la futex hombre de la página, EINVAL se devuelve cuando "Una operación no fue definido o error en la alineación de la página."

En nuestro caso, ya sea la eliminación de la pragma pack(1) la directiva o definir el semáforo como el primer elemento de la estructura, resuelto el problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top