سؤال

ولدي طابور مع الإشارة. عند نقطة معينة كل المكالمات إلى sem_post() دوما بإرجاع الخطأ "وسيطة غير صالحة" على الرغم من أن الإشارة نفسها صالحة

والإشارة هي عضو خاص من وجوه C ++ التي يتم حذفها أبدا، كما أنها يمكن أن تفقد في جدب. وأضاف لي 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);
    }
}
هل كانت مفيدة؟

المحلول

وماذا يمكن أن يكون الخطأ؟ أي عدد من الاشياء. شيء آخر يمكن أن تدمر الإشارة أو الكتابة فوق الذاكرة المستخدمة لتخزين أو مؤشر على ذلك. والاحتمال الآخر هو أن كنت تتصل sem_post () في كثير من الأحيان وتجاوزات العداد. ومن شأن نموذج التعليمات البرمجية تساعد.

نصائح أخرى

وكان لدينا نفس المشكلة، وبعد وقت طويل في معرفة ما يمكن أن يحدث، اكتشفنا أن المشكلة حدثت بسبب تم تعريف الإشارة داخل البنية التي كانت تغيرت محاذاة بايت ل1 (في هذه الحالة باستخدام PRAGMA حزمة (1) التوجيه).

وتنفيذ الإشارات POSIX على لينكس يستخدم syscall futex. وفقا لصفحة الرجل futex، يتم إرجاع EINVAL عندما "لم يتم تعريف إجراء عملية أو خطأ في محاذاة الصفحة."

في حالتنا، إما إزالة PRAGMA حزمة (1) توجيه أو تحديد الإشارة باعتبارها العنصر الأول من البنية، حل المشكلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top