C++ 使用示例进行多线程处理
什么是线程
在C++中,线程是一种在特定进程中使用的工作单位类型。在多程序操作系统中,有一些不同的进程同时执行。
同样地,借助于线程,我们可以多次执行相同的进程。在这种情况下,每个进程都关联有一个称为线程的单位。在多线程进程中,同时执行许多线程,它们是相互独立的。
<Thread>
的工作原理
我们可以使用std::thread来创建一个新的线程对象,然后将该新创建的线程传递给可调用对象。这里的可调用对象是一种在线程运行期间执行的可执行代码类型。因此,只要有线程的需求,我们只需创建该对象并将可调用对象作为其构造函数的参数传递给它。创建了新线程对象后,新线程将被启动,可调用代码将被执行。
我们可以通过三种方式定义可调用对象。这三种方式如下:
1. 使用函数对象:
在线程对象中,我们可以使用函数对象作为可调用对象。为了实现该函数对象,首先我们需要一个类,并在该类内部重载运算符 (). 当创建线程时,执行包含重载函数的代码。
std::thread thread_object(functioObject_class (), params)
通过上述命令的帮助,线程对象被定义。在构建线程对象的过程中,我们必须提供重载的函数,并将其参数指定为第二个参数。
2. 使用函数指针:
我们可以通过以下方式定义可调用的函数。
void funct_call(params)
//code to be executed
}
一旦我们定义了函数,我们就必须使用可调用的函数创建线程对象。我们可以通过下面的方法来实现。
std::thread thread_obj(funct_call, params);
我们可以在对象的函数名之后将参数传递给函数。
3. 使用Lambda表达式:
我们也可以将可调用的函数作为Lambda表达式。然后我们可以将Lambda表达式传递给线程对象以执行代码。
auto f = [](params) {
};
std::thread thread_object(f, params);
在上面的代码中,我们必须实现lambda表达式;然后,我们需要通过以下参数将lambda表达式传递给线程对象构造函数来实现。
std :: thread join方法,在某些情况下,我们可能希望在开始新任务之前完成当前执行的任务。
最好的示例是当我们尝试打开一个GUI应用程序时。当我们打开应用程序时,会加载一个线程,并启动GUI。在加载和初始化完成之前,我们无法执行任何其他操作。
以以下示例为例,
int main()
{
std::thread t1(callable_code);
.....
t1.join();
.....
}
在上面的示例中,主函数必须等待thread t1完成后才能继续执行。通常情况下,线程的join函数会阻塞其他动作/功能,直到调用线程执行完毕。
线程示例
我们提供了一个完整的编码示例,来展示在线程中创建和执行的程序。
#include
#include
using namespace std;
// function to be used in callable
void func_dummy(int N)
{
for (int i = 0; i < N; i++) {
cout << "Thread 1 :: callable => function pointer\n";
}
}
// A callable object
class thread_obj {
public:
void operator()(int n) {
for (int i = 0; i < n; i++)
cout << "Thread 2 :: callable => function object\n";
}
};
int main()
{
// Define a Lambda Expression
auto f = [](int n) {
for (int i = 0; i < n; i++)
cout << "Thread 3 :: callable => lambda expression\n";
};
//launch thread using function pointer as callable
thread th1(func_dummy, 2);
// launch thread using function object as callable
thread th2(thread_obj(), 2);
//launch thread using lambda expression as callable
thread th3(f, 2);
// Wait for thread t1 to finish
th1.join();
// Wait for thread t2 to finish
th2.join();
// Wait for thread t3 to finish
th3.join();
return 0;
}
输出:
解释:
在上面的示例中,我们使用三个不同的可调用对象创建了三个线程,即函数指针、对象和lambda表达式。我们创建了每个线程的两个实例并启动它们。如输出所示,三个线程同时且独立地运行。