从调用这些线程的“母”类对象中的线程访问方法

时间:2019-06-09 23:22:08

标签: c++ multithreading thread-safety

我想在从该线程创建线程的类中调用一个函数。

目前我有两个类,一个是 Helper-Class ,另一个是 Async-Worker-Class

首先,我的 Helper-Class 在我的 main()中实例化。该线程是在 Helper-Class 中创建的。应当可以实例化多个 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)
            }
        }
    }
};

现在我的问题是如何以线程安全的方式实现这一目标?是否可以(并且允许或良好实践)将我的线程传递给调用方Helper-Instance的引用? 我的第二个问题是:添加的同步是否足够?

更新:我不希望我的助手等待传入的数据。应该可以保持循环并定期检查现在是否已到达数据。如果发现了新数据,则应进行处理,否则我的助手应该继续做其他事情。

0 个答案:

没有答案