Доступ к методу из потока в "материнском" объекте класса, который вызвал этот поток - PullRequest
1 голос
/ 10 июня 2019

Я хочу вызвать функцию в классе, который создал поток из этого потока.

В настоящее время у меня есть два класса: класс помощников и мой класс асинхронных рабочих .

Первый мой класс помощников создается в моем main () .Поток создан в Helper-Class .Должно быть возможно создать более одного класса помощника .Итак, количество экземпляров и потоков одинаково.

int main(){
    //This is where my helper is constructed
    Helper myHelper_1();
    Helper myHelper_2();

}

Теперь мой вспомогательный класс выглядит следующим образом.Конструктор Helper-Class создает новый поток - я назвал его t1 .

class Helper {
    std::stack <std::string> names_for_adding;
    std::mutex helper_lock;

    void processName(std::string name);


    // The constructor of my "mother"-class constructs the thread
    Helper() {
        // I've created an instance of AsyncThread
        AsyncThread my_async_worker();

        //Call the thread
        std::thread t1(&AsyncThread::scan, &my_async_worker);
        t1.detach();

        while(true) {
            std::cout << "Doing some stuff.." << std::endl;

            //Now oi check if my
            helper_lock.lock();
            std::string my_name = names_for_adding.top();
            names_for_adding.pop();
            // E. g. process the name
            processName(my_name);
            helper_lock.unlock();
        }
    }

    void addToQueue(std::string name) {
        helper_lock.lock();
        names_for_adding.push(name);
        helper_lock.unlock();
    }
};

Второй класс, AsyncThread , предназначен только для сканирования во время работы.Одной из задач может быть, например, получение непериодически различных дат (например, имен) (из канала или сокета).Если имя соответствует данному фильтру (например, 'foo'), я хочу уведомить об этом мой Helper-Instance и добавить найденное имя в очередь для дальнейшей обработки.

class AsyncThread {

public:
    void scan() {
        std::string name;
        //Doing the scan procedure
        //...
        while (true) {
            // ...Receiving names ...
            // A name has been found which matches the given filter
            if (name == "foo") {
                std::cout << "Name found, adding to helper" << std::endl;
                //like: myHelper_1.addToQueue(name)
                //now i want to call the function 'addToQueue' from my
                //my class helper (which is also an object)
            }
        }
    }
};

Теперь мой вопрос: как этого добиться потокобезопасным способом?Возможно ли (и разрешено ли, или хорошая практика) передать моей теме ссылку на вызывающий экземпляр-помощник?Мой второй вопрос: достаточно ли добавленной синхронизации?

Обновление: я не хочу, чтобы мой помощник ожидал поступающих данных.Должна быть возможность оставаться в цикле и периодически проверять, поступили ли сейчас данные.Если новые данные были найдены, это должно быть обработано, иначе мой помощник должен продолжать делать другие вещи.

...