pthread 互斥锁无法正常工作

问题描述 投票:0回答:1

我有一段代码,我使用 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 解锁事件循环互斥体。

pthreads mutex
1个回答
0
投票

请格式化代码并正确插入{}。 删除注释以使您的代码更具可读性。

尝试从函数中执行一次返回,以避免意外的锁定/解锁行为。

© www.soinside.com 2019 - 2024. All rights reserved.