Выполнение каждого объекта в отдельном потоке в C ++ с использованием std :: thread

Рассмотрим два класса, как показано ниже

class CommandChannel
{
private:
    std::thread cChannelThread;
public:
    CommandChannel();
    ~CommandChannel();

    void start_comm_channel(int port, std::string ip);

    int myfunction(int a, int b);
    double otherfunction(std::string test);

    void stop_comm_channel();
};


class EventChannel
{
private:
    std::thread evChannelThread;
public:
    EventChannel();
    ~EventChannel();

    void start_ev_chnl(int port, std::string ip);

    int evFunction(int a, int b);
    double anotherfunction(std::string othertest);

    void stop_ev_chnl();
};

Я хочу публиковать публичные функции для пользователя таким образом, что всякий раз, когда пользователь вызывает функции из класса CommandChannel они запускаются в одном потоке, например, cChannelThread . И всякий раз, когда пользователь вызывает функцию из класса EventChannel они запускаются в другом потоке, который является evChannelThread . Я не уверен, что это хорошая идея, но я новичок в C ++, особенно новичок в многопоточности. Основная идея состоит в том, EventChannel полностью сохранить класс EventChannel в другом потоке, кроме класса CommandChannel . PS Этот вопрос - это перефразированная версия вопроса, который я ранее задал, который был отложен. Надеюсь, на этот раз он станет более ясным.

Всего 1 ответ


Я хочу публиковать публичные функции для пользователя таким образом, что всякий раз, когда пользователь вызывает функции из класса CommandChannel они запускаются в одном потоке, скажем, cChannelThread

В этом случае вам нужно переслать вызов в другой поток. Это можно сделать, сохранив функцию-указатель / лямбда с копиями всех аргументов вызова в объект std::function<void()> , передав этот объект другому потоку и вызывая этот объект.

Если ваши функции возвращают что-то еще, то void то вам нужен механизм для передачи возвращаемого значения обратно вызывающему потоку. Существует несколько способов сделать это, вы можете начать с использования std::packaged_task .

Для передачи объектов между потоками используется атомная очередь, такая как классы параллельных классов Intel .

Будьте внимательны при совместном использовании объектов между потоками. Если объект разделяется между потоками, и по крайней мере один поток изменяет объект, тогда для предотвращения условий гонки требуется блокировка.


Есть идеи?

10000