void运算符()理解

void operator()() understanding

本文关键字:理解 运算符 void      更新时间:2023-10-16

我正在学习如何在boost库中使用线程,在搜索过程中我发现了以下代码:

struct count
{
count(int id) : id(id) {}
void operator()()
{
for (int i = 0; i < 10; ++i)
{
boost::mutex::scoped_lock
lock(io_mutex);
std::cout << id << ": " << i << std::endl;
}
}
int id;
};
int main(int argc, char* argv[])
{
boost::thread thrd1(count(1));
boost::thread thrd2(count(2));
thrd1.join();
thrd2.join();
return 0;
}

这个程序运行良好,但我的问题是,void operator()()函数的行为是什么?因为有两个线程,每个线程用不同的值初始化计数。它的两个主要count变量是单独创建的,因此每个变量的void operator()()应该不同。但似乎void operator()()对于两个线程都是相同的。这段代码中还有一件事void operator()()不是从任何地方调用的,那么它是如何运行的呢?

有人能解释一下这个函数里面发生了什么吗?

void operator()() 

这是一个棘手的语法。

boost::thread thrd1(count(1));
boost::thread thrd2(count(2));

在这两行中,operator()NOT直接调用。此处可见的count(n)构造函数。然后,用"1"answers"2"值构造的对象被传递给thread对象,然后该对象在内部调用operator(),以在为此目的创建的不同线程上运行特定任务。

但由于两个对象在它们的actor中记住了不同的值(1/2),operator()中的公共代码对id字段的不同实际值进行操作。这就是运算符没有参数的原因:在构造过程中,所有必需的参数都存储在"count"对象中。

Btw。要构造一个对象并调用operator(),一行看起来像这样:

count(1)();

C++中运算符重载的语法为:

返回类型运算符运算符名称(args);示例:int运算符+(int other)这里的操作员名称是"+"。在你的情况下,它是"()">

现在,您有两个线程实例,每个实例都有自己的计数实例。当线程调用operator()()时,它读取线程的特定实例的计数值,这就是为什么对同一个运算符有不同的结果

它肯定会帮助您阅读代码的上下文(并在此处为其他读者发布链接:)。

如果没有任何其他上下文来帮助我,我想这是对boost::thread新学习者的一次演示。我假设你知道线程是如何工作的——如果你是新手,这个链接是一个很好的初学者概念参考。

分解:

boost::thread thrd1(count(1));
boost::thread thrd2(count(2));

创建具有不同Id的两个线程。正如@quetzalcoatl所提到的,boost线程接收一个定义operator ()()的函数对象,并在另一个线程中执行该运算符的内容。这意味着我们现在有3个线程——主执行线程和上面创建的2个线程。

thrd1.join();
thrd2.join();

主执行线程等待其他两个线程加入,即完成它们的处理并向主线程指示它们已经完成。当他们加入时,线程被终止(请注意,thrd1是一个boost线程对象,用于引用我们在幕后创建的实际线程,并且在堆栈结束之前一直可用)。

operator()()是一种监视a.哪个线程正在运行以及b.发生了多少"线程之间的跳过"的方法。在解释之前,让我们看看结果。它可能是类似(但可能不完全):

1: 0
1: 1
2: 0
2: 1
2: 2
2: 3
1: 2 ...    

因此,程序(在本例中)运行线程#1的两个循环,切换到线程#2,运行几个循环,返回到#1并继续运行。两个线程不能同时进入循环是有原因的——boost scoped_lock抓住(外部)io_mutex,将其锁定以供该线程使用,然后继续运行,直到scoped_lock对象被销毁,io_mutex对象被释放。这意味着,当两个线程并行运行时,在"scoped_lock"调用之后,只有一个对象可以访问该特定堆栈。

希望能有所帮助。