【发布时间】:2014-06-05 12:20:06
【问题描述】:
在《C++ Concurrency in Action》§3.3.1 一书中,在介绍使用std::call_once() 对类成员进行线程安全的延迟初始化时,给出了以下示例:
#include <mutex>
struct connection_info
{};
struct data_packet
{};
struct connection_handle
{
void send_data(data_packet const&)
{}
data_packet receive_data()
{
return data_packet();
}
};
struct remote_connection_manager
{
connection_handle open(connection_info const&)
{
return connection_handle();
}
} connection_manager;
class X
{
private:
connection_info connection_details;
connection_handle connection;
std::once_flag connection_init_flag;
void open_connection()
{
connection=connection_manager.open(connection_details);
}
public:
X(connection_info const& connection_details_):
connection_details(connection_details_)
{}
void send_data(data_packet const& data)
{
std::call_once(connection_init_flag,&X::open_connection,this);
connection.send_data(data);
}
data_packet receive_data()
{
std::call_once(connection_init_flag,&X::open_connection,this);
return connection.receive_data();
}
};
int main()
{}
从its doc开始,第三个参数是传递给函数X::open_connection()的参数。鉴于X::open_connection() 没有输入参数,为什么在调用std::call_once() 时需要this 指针?
std::call_once(connection_init_flag,&X::open_connection,this);
P.S.:删除this指针会导致C2064错误:
error C2064: term does not evaluate to a function taking 0 arguments
更新:在“C++ Concurrency in Action”一书的第 4.2.1 节中在引入类似功能时进一步明确解决了此问题,即std::async:
如果第一个参数(应该是
std::call_once的第二个)是指向成员函数的指针,则第二个参数(应该是std::call_once的第三个)提供要应用的对象成员函数(直接,或通过指针,或包装在std::ref中),其余参数作为参数传递给成员函数。 否则,第二个(应该是 @987654335 的第三个@) 和后续参数作为参数传递给指定为第一个参数的函数或可调用对象。
【问题讨论】:
标签: c++ multithreading pointers c++11 this-pointer