IM
Size: a a a
IM
Eあ
QThread::finished
с QObject::deleteLater
этого треда. И видимо внутренности QMutex
уже разрушаются на момент вызова QMutex::lock
который крашил. Догадался я до этого по сурсам Qt и увидел что причина моего краша в конечном счёте это доступ к QMutexData
которая уже очищена внутри самого QMutex
. Теперь краша нет. Каждый раз когда подобную ошибку удаётся разрешить не чувствую ничего кроме прострации.WB
IM
SK
QThread::finished
с QObject::deleteLater
этого треда. И видимо внутренности QMutex
уже разрушаются на момент вызова QMutex::lock
который крашил. Догадался я до этого по сурсам Qt и увидел что причина моего краша в конечном счёте это доступ к QMutexData
которая уже очищена внутри самого QMutex
. Теперь краша нет. Каждый раз когда подобную ошибку удаётся разрешить не чувствую ничего кроме прострации.Eあ
t
SK
AS
#include "pretty_thread_logger.h"
#include <condition_variable>
#include <iostream>
#include <mutex>
#include <thread>
namespace example
{
std::mutex condvar_mutex;
std::condition_variable condvar;
bool product = false;
void producer()
{
using namespace std::chrono_literals;
pretty_thread_logger::info("producer enter");
pretty_thread_logger::info("std::this_thread::sleep_for(2s);");
std::this_thread::sleep_for(2s);
pretty_thread_logger::info("std::lock_guard<std::mutex> guard{ condvar_mutex };");
std::lock_guard<std::mutex> guard{ condvar_mutex };
pretty_thread_logger::info("product = true;");
product = true;
pretty_thread_logger::info("condvar.notify_all();");
condvar.notify_all();
pretty_thread_logger::info("producer leave");
}
void consumer()
{
using namespace std::chrono_literals;
pretty_thread_logger::info("consumer enter");
pretty_thread_logger::info("std::unique_lock<std::mutex> exit_locker{ condvar_mutex };");
std::unique_lock<std::mutex> locker{ condvar_mutex };
pretty_thread_logger::info("condvar.wait");
condvar.wait(locker, []()
{
return product;
});
pretty_thread_logger::info("consumer leave");
}
void test()
{
pretty_thread_logger::info("test enter");
pretty_thread_logger::info("create producer");
std::thread p{ producer };
pretty_thread_logger::info("create consumer 1");
std::thread c1{ consumer };
pretty_thread_logger::info("create consumer 2");
std::thread c2{ consumer };
pretty_thread_logger::info("wait for producer done");
p.join();
pretty_thread_logger::info("wait for consumer 1 done");
c1.join();
pretty_thread_logger::info("wait for consumer 2 done");
c2.join();
pretty_thread_logger::info("test leave");
}
}
int main() {
example::test();
pretty_thread_logger::set_thread_column_width(30);
pretty_thread_logger::show(std::cout);
}
AS
t
SK
Eあ
#include "pretty_thread_logger.h"
#include <condition_variable>
#include <iostream>
#include <mutex>
#include <thread>
namespace example
{
std::mutex condvar_mutex;
std::condition_variable condvar;
bool product = false;
void producer()
{
using namespace std::chrono_literals;
pretty_thread_logger::info("producer enter");
pretty_thread_logger::info("std::this_thread::sleep_for(2s);");
std::this_thread::sleep_for(2s);
pretty_thread_logger::info("std::lock_guard<std::mutex> guard{ condvar_mutex };");
std::lock_guard<std::mutex> guard{ condvar_mutex };
pretty_thread_logger::info("product = true;");
product = true;
pretty_thread_logger::info("condvar.notify_all();");
condvar.notify_all();
pretty_thread_logger::info("producer leave");
}
void consumer()
{
using namespace std::chrono_literals;
pretty_thread_logger::info("consumer enter");
pretty_thread_logger::info("std::unique_lock<std::mutex> exit_locker{ condvar_mutex };");
std::unique_lock<std::mutex> locker{ condvar_mutex };
pretty_thread_logger::info("condvar.wait");
condvar.wait(locker, []()
{
return product;
});
pretty_thread_logger::info("consumer leave");
}
void test()
{
pretty_thread_logger::info("test enter");
pretty_thread_logger::info("create producer");
std::thread p{ producer };
pretty_thread_logger::info("create consumer 1");
std::thread c1{ consumer };
pretty_thread_logger::info("create consumer 2");
std::thread c2{ consumer };
pretty_thread_logger::info("wait for producer done");
p.join();
pretty_thread_logger::info("wait for consumer 1 done");
c1.join();
pretty_thread_logger::info("wait for consumer 2 done");
c2.join();
pretty_thread_logger::info("test leave");
}
}
int main() {
example::test();
pretty_thread_logger::set_thread_column_width(30);
pretty_thread_logger::show(std::cout);
}
t
Eあ
QRegularExpression
вместо устаревшего QRegExp
Eあ
\{([^\{\}]*)\}
Eあ
t
\{([^\{\}]*)\}
SK
\{([^\{\}]*)\}