我想知道有多少不同的线程在其生命周期中使用了对象函数。
我天真的方法是创建一个基类来注册调用线程的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的值 无法再加入
问题:
有可行且安全的方法吗?
答案 0 :(得分:1)
我相信您可以使用线程本地存储来计算调用函数的线程数:
namespace {
thread_local bool used = false;
}
void register_call()
{
if( !used ) {
used = true;
++count;
}
}
当然这段代码是为了表明这个想法,在实际代码中它可以是一个指向容器的指针,它保存了感兴趣的函数的地址等。