I have 2 threads,
one thread creates a pipeline and responsible for it,
another thread creates a communication of that pipeline with outer world,
so I want to create the communication after the pipeline is initialized.
This code works, but:
- mutex there have a warning:
C26110 Caller failing to hold lock 'm' before calling function 'std::_Mutex_base::unlock'
, what is it about? - how I could rewrite it without manual mutex manipulation?
#include <iostream>
#include <mutex>
using namespace std::chrono_literals;
class Pipeline {
public:
Pipeline() { std::cout << "Pipeline()\n"; };
void init() { std::cout << "Pipeline::init()\n"; std::this_thread::sleep_for(3s); };
void run() { while (true) { std::cout << "Pipeline::run()\n"; std::this_thread::sleep_for(1s); } };
};
class Connection {
public:
Connection(Pipeline* p) { std::cout << "Connection()\n"; };
void run() { while (true) { std::cout << "Connection::run()\n"; std::this_thread::sleep_for(1s); } };
};
void pipeline_func(Pipeline** pipeline, std::mutex& m) {
*pipeline = new Pipeline();
(*pipeline)->init();
m.unlock();
(*pipeline)->run(); // run indefinitely
};
void connection_func(Pipeline** pipeline, std::mutex& m) {
m.lock();
Connection connection(*pipeline);
connection.run(); // run indefinitely
};
int main() {
Pipeline* pipeline = nullptr;
std::mutex m;
m.lock(); // lock there for stopping connection3_thread, intil mutex is unlocked in pipeline_thread
std::thread pipelineTh(pipeline_func, &pipeline, std::ref(m));
std::thread connectionTh(connection_func, &pipeline, std::ref(m));
pipelineTh.join();
connectionTh.join();
m.unlock();
}