C ++:如何计算用于调用函数的线程数?

时间:2014-06-10 13:19:25

标签: c++ multithreading c++11

我想知道有多少不同的线程在其生命周期中使用了对象函数。

我天真的方法是创建一个基类来注册调用线程的id:

class threaded_object
{
public:
    virtual ~threaded_object() {}

protected:
    void register_call()
    {
                    // error ! if the ID is reused, the new thread wont be accounted for.
        callers_ids.insert(std::this_thread::get_id());
    }

    size_t get_threads_cout() const
    {
        return callers_ids.size();
    }

private:
    std::set<std::thread::id> callers_ids;
};

要在我的客户端类中继承它,在这里我将计算使用foo()

的线程数
class MyObject : public threaded_object
{
 void foo()
 {
    register_call();
    // ...
 }
};

但它在一般情况下不起作用,标准在第30.3.1.1节中说明

  

库可以重用已终止线程的thread :: id的值   无法再加入

问题:

有可行且安全的方法吗?

1 个答案:

答案 0 :(得分:1)

我相信您可以使用线程本地存储来计算调用函数的线程数:

namespace {
    thread_local bool used = false;
}


void register_call()
{
    if( !used ) {
        used = true;
        ++count;
    }
}

当然这段代码是为了表明这个想法,在实际代码中它可以是一个指向容器的指针,它保存了感兴趣的函数的地址等。