C++中的多线程与实例

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();
   .....
   }

在上面的例子中,主函数将不得不等待继续,直到线程t1完成。一般来说,线程的连接函数会阻止其他动作/功能,直到调用的线程完成其执行。

线程的例子

我们在下图所示的程序中介绍一个完整的线程创建和执行的编码示例。

#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;
}

输出。

C++中的多线程与实例

解释。

在上面的例子中,我们使用三种不同的可调用方式创建了三个线程,即函数指针、对象和lambda表达式。我们为每个线程创建两个实例并启动它们。如输出中所示,三个线程同时独立运行。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程