Я только начал снова работать с cpp после использования python. У меня вопрос по темам.
Настройка: основной метод, который создает объект, содержащий функцию потребителя, а также функцию производителя. Я хотел бы запускать их независимо друг от друга как два или три потока для дополнительного потребителя или производителя. (См. Занятия). С установки я думаю, что понял тему потоков, однако я не понимаю ошибку, которую я получил, так как я не так часто использую потоки cpp.
ОШИБКА:
ошибка C2893: Funktionsvorlage "неизвестный тип std :: invoke (_Callable &&, _ Types && ...) noexcept ()" konnte nicht spezialisiert werden
xthread (237): примечание: Mit den folgenden Vorlagenargumenten:
xthread (237): примечание: "_Callable = void (__thiscall Worker_Consumer :: *
) (std :: mutex &, std :: condition_variable
&, std :: deque> &) "
xthread (237): примечание: "_Types = {std :: mutex *, std :: condition_variable *,
std :: deque> *} "
#include "pch.h"
#include <iostream>
#include "CAN_MESSAGE.h"
#include <bitset>
#include <thread>
#include "Worker_Consumer.h"
#include <mutex>
#include <condition_variable>
#include <chrono>
int main()
{
//sendMessage();
std::deque<int> sharedQ;
mutex mtx;
condition_variable convar;
std::thread t1(&Worker_Consumer::startProducer,&mtx,&convar, &sharedQ);
std::thread t2(&Worker_Consumer::startConsumer,&mtx, &convar, &sharedQ);
t1.join();
t2.join();
}
Как и мой заголовочный файл (только для тестирования я прямо кодировал его внутри).
#pragma once
#include <mutex>
#include <thread>
#include <condition_variable>
#include <iostream>
#include <deque>
using namespace std;
class Worker_Consumer {
private:
int WORKER_ID = 0;
int TRIGGER = 0;
bool is_running1 = false;
bool is_running2 = false;
public:
//PRODUCER
void startProducer(mutex &mtx, condition_variable &convar, std::deque<int> &sharedQ) {
this->is_running1 = true;
int count = 10;
while (count > 0) {
std::unique_lock<mutex> locker(mtx);
sharedQ.push_front(count);
locker.unlock();
convar.notify_one(); //wakes up thread2
std::this_thread::sleep_for(chrono::seconds(1));
count--;
}
this->is_running1 = false;
}
//CONSUMER
void startConsumer(mutex &mtx, condition_variable &convar, std::deque<int> &sharedQ) {
this->is_running2 = true;
int data = 0;
while (data != 1) {
std::unique_lock<mutex>locker(mtx);
convar.wait(locker);
data = sharedQ.back();
sharedQ.pop_back();
locker.unlock();
cout << "t2 got a value from t1:" << data << endl;
}
this->is_running2 = false;
}
bool isActive1() {
return this->is_running1;
}
bool isActive2() {
return this->is_running2;
}
//DEKLARATION VON GETTERN FUER KONSTANTEN
Worker_Consumer() {
}
};
THX и Greedings