类t_analyser
包含一个对t_data
对象执行某些操作并输出结果的函数。
我想向t_analyser
添加一个过滤功能:一个小而快的功能
bool filter(const t_data & d) {...}
如果满足特定数据的某些条件,则允许跳过分析(和输出)。过滤器应该很容易从main设置,所以我想在t_analyser
中存储一个共享函数指针并使用lambda来初始化它。
这是一个好方法吗?我担心的是,许多分析仪可以在不同的线程中同时调用相同的过滤功能,这可能是个问题吗?我可以简单地复制t_analyser
的复制构造函数中的指针吗?任何提示都会非常感激。
答案 0 :(得分:1)
如果您的过滤器功能有副作用,这可能是一个问题。它的签名很简单,并说它只是从t_data
做出一些决定读取数据,因此请确保t_data
未在并行线程中修改,你会没事的。
答案 1 :(得分:0)
考虑以下计划:
#include <iostream>
struct X
{
void foo1(){ std::cout << "foo1" << std::endl; }
void foo2(){ std::cout << "foo2" << std::endl; }
};
typedef void (X::*MemberFunctionPointer)();
struct ByRef
{
ByRef( MemberFunctionPointer& f )
: f_( f )
{
}
void operator()()
{
X x;
(x.*f_)();
}
MemberFunctionPointer& f_;
};
struct ByValue
{
ByValue( MemberFunctionPointer f )
: f_( f )
{
}
void operator()()
{
X x;
(x.*f_)();
}
MemberFunctionPointer f_;
};
int main()
{
MemberFunctionPointer p = &X::foo1;
ByRef byRef( p );
ByValue byValue( p );
byRef();
byValue();
p = &X::foo2;
byRef();
byValue();
return 0;
}
输出:
foo1
foo1
foo2
foo1
Press <RETURN> to close this window...
从这里你会注意到,在一种情况下,成员函数指针通过值(而不是共享)传递,而在另一种情况下,它通过引用(和共享)传递。使用语法时:
foo(void(X :: * f)())...
指向成员函数的指针按值传递,并再次复制(并且无法修改)。
答案 2 :(得分:0)
您可以将函数指针声明为静态+线程特定:
static _declspec(thread) FUNC_TYPE filterFunc;
修改filterFunc的每个线程都在指针的不同副本上工作。