gpt4 book ai didi

linux - sem_post() 因有效信号量而失败

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:31:01 27 4
gpt4 key购买 nike

我有一个带有信号量的队列。在某些时候,所有对 sem_post() 的调用总是返回“无效参数”错误,尽管信号量本身是有效的

信号量是C++对象的私有(private)成员,永远不会被删除,也可以在gdb中查看。我在 sem_post() 之前添加了 sem_getvalue() - 值读取正常,然后在 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() 的次数过多,导致计数器溢出。代码示例会有所帮助。

关于linux - sem_post() 因有效信号量而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/685284/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com