我有一段代码,我使用 pthread_mutex_t 来保护关键部分,但它不起作用,当一个线程锁定互斥体时,另一个线程可以访问关键部分,无论第一个线程尚未解锁互斥体。 这是我的代码:
#include "Eventloop.h"
#include <iostream>
pthread_t Eventloop::loopThread;
std::list<Event *> Eventloop::eventList;
pthread_mutex_t Eventloop::mutex;
Eventloop * Eventloop::eventloop = NULL;
pthread_mutex_t Eventloop::suspendMutex;
pthread_cond_t Eventloop::resumeCond;
void *checkEvents(void *args)
{
while (1) {
std::list<Event *>::iterator it;
/* If event list is empty release control of processor
** The thread is moved to the end of the queue
*/
pthread_mutex_lock(&Eventloop::mutex);
std::cout << "checkEvents lock eventloop mutex. \n";
if (Eventloop::eventList.empty()) {
}
else {
for(it = Eventloop::eventList.begin() ; it != Eventloop::eventList.end() ; it++) {
(*it)->check();
}
}
pthread_mutex_unlock(&Eventloop::mutex);
std::cout << "checkEvents unlock eventloop mutex. \n";
}
}
/* Event loop constructor to create and detach the event thread */
Eventloop::Eventloop()
{
pthread_create(&Eventloop::loopThread, NULL, &checkEvents, NULL);
pthread_detach(Eventloop::loopThread);
}
void Eventloop::init()
{
if (pthread_mutex_init(&mutex, NULL) == 0) {
std::cout << "Eventloop mutex init succeed. \n";
} else {
std::cout << "Eventloop mutex init failed. \n";
}
getInstance();
}
/* Instantiate the event loop.
** Event loop use singleton design pattern to ensure just only one object is instantiated
*/
Eventloop *Eventloop::getInstance()
{
if(eventloop == NULL)
eventloop = new Eventloop();
return eventloop;
}
/* append() method to append events */
EventloopErr_t Eventloop::append(Event **event)
{
pthread_mutex_lock(&mutex);
std::list<Event *>::iterator it;
for(it = eventList.begin() ; it != eventList.end() ; it++) {
if((*it) == *event) {
pthread_mutex_unlock(&mutex);
return EVL_ERR_EVENT_EXISTS;
}
}
if (eventList.empty())
resumeThread();
std::cout << "Event in append method= " << *event << "\n";
eventList.push_back(*event);
pthread_mutex_unlock(&mutex);
return EVL_ERR_OK;
}
/* remove() method to remove events */
void Eventloop::remove(Event **event)
{
pthread_mutex_lock(&mutex);
std::cout << "Eventloop::remove lock eventloop mutex. \n";
std::list<Event *>::iterator it;
std::cout << "Event in remove function = " << *event << "\n";
for(it = eventList.begin() ; it != eventList.end() ; it++) {
std::cout << "event = " << (*it) << "\n";
if((*it) == *event) {
delete eventList.back();
std::cout << "Address in list= " << eventList.back();
eventList.remove(*event);
}
}
pthread_mutex_unlock(&mutex);
std::cout << "Eventloop::remove unlock eventloop mutex. \n";
}
我希望 **Eventloop::remove(Event event) 函数在被线程锁定时无法进入临界区,但事实并非如此。 这是日志:
checkEvents 锁定事件循环互斥体。 <-- this line mutex is locked.
定时器析构函数启动。
Eventloop::remove 锁定 eventloop 互斥体。 <-- also in this line mutexis locked again.
删除函数中的事件 = 0x7f87c3705aa0。
事件 = 0x7f87c3705aa0。
定时器事件析构函数
checkEvents 解锁事件循环互斥体。
请格式化代码并正确插入{}。 删除注释以使您的代码更具可读性。
尝试从函数中执行一次返回,以避免意外的锁定/解锁行为。