小编Wic*_*par的帖子

Cocket在互斥锁上的并发段错误

你好,

我是C++的新手,但我有6年的Java经验,2年的C经验和一些并发基础知识.我正在尝试创建一个线程池来处理任务.它位于相关测试主体的下方.

似乎错误是由...生成的

void ThreadPool::ThreadHandler::enqueueTask(void (*task)(void)) {
    std::lock_guard<std::mutex> lock(queueMutex);
Run Code Online (Sandbox Code Playgroud)

正如我的调试器所说,但是做传统的cout调试,我发现有时候它可以在没有segfaulting和删除的情况下工作

threads.emplace(handler->getSize(), handler);
Run Code Online (Sandbox Code Playgroud)

ThreadPool::enqueueTask()大大提高稳定性.

总的来说,我认为这与我对condition_variable(称为idler)的错误使用有关.

编译器:CLION中的minGW-w64

的.cpp

#include <iostream>
#include "ThreadPool.h"

ThreadPool::ThreadHandler::ThreadHandler(ThreadPool *parent) : parent(parent) {
    thread = std::thread([&]{
        while (this->parent->alive){
            if (getSize()){
                std::lock_guard<std::mutex> lock(queueMutex);
                (*(queue.front()))();
                queue.pop_front();
            } else {
                std::unique_lock<std::mutex> lock(idlerMutex);
                idler.wait(lock);
            }
        }
    });
}

void ThreadPool::ThreadHandler::enqueueTask(void (*task)(void)) {
    std::lock_guard<std::mutex> lock(queueMutex);
    queue.push_back(task);
    idler.notify_all();
}

size_t ThreadPool::ThreadHandler::getSize() {
    std::lock_guard<std::mutex> lock(queueMutex);
    return queue.size();
}

void ThreadPool::enqueueTask(void (*task)(void)) {
    std::lock_guard<std::mutex> lock(threadsMutex);
    std::map<int, ThreadHandler*>::iterator iter = threads.begin();
    threads.erase(iter);
    ThreadHandler *handler = …
Run Code Online (Sandbox Code Playgroud)

c++ concurrency mutex condition-variable

1
推荐指数
1
解决办法
1434
查看次数

标签 统计

c++ ×1

concurrency ×1

condition-variable ×1

mutex ×1