成员函数指针的线程安全性

时间:2013-11-19 10:38:33

标签: multithreading c++11 thread-safety function-pointers member

t_analyser包含一个对t_data对象执行某些操作并输出结果的函数。

我想向t_analyser添加一个过滤功能:一个小而快的功能

bool filter(const t_data & d) {...}

如果满足特定数据的某些条件,则允许跳过分析(和输出)。过滤器应该很容易从main设置,所以我想在t_analyser中存储一个共享函数指针并使用lambda来初始化它。

这是一个好方法吗?我担心的是,许多分析仪可以在不同的线程中同时调用相同的过滤功能,这可能是个问题吗?我可以简单地复制t_analyser的复制构造函数中的指针吗?任何提示都会非常感激。

3 个答案:

答案 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的每个线程都在指针的不同副本上工作。