Cpp Contentfunction вне потока, используя общую очередь - PullRequest
1 голос
/ 11 марта 2019

Я только начал снова работать с 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...