多线程相关

2020-06-03  本文已影响0人  不ai吃糖

在c++中使用std::thread定义线程对象,一个对象对应一个线程,几个线程可以在多线程设备上同时运行,测试用例如下:

<code>

// thread example

#include <iostream>      // std::cout

#include <thread>        // std::thread

void foo()

{

  // do stuff...

}

void bar(int x)

{

  // do stuff...

}

int main()

{

  std::thread first (foo);    // spawn new thread that calls foo()

  std::thread second (bar,0);  // spawn new thread that calls bar(0)

  std::cout << "main, foo and bar now execute concurrently...\n";

  // synchronize threads:

  first.join();                // pauses until first finishes

  second.join();              // pauses until second finishes

  std::cout << "foo and bar completed.\n";

  return 0;

}

</code>

output

<code>

main, foo and bar now execute concurrently...

foo and bar completed.

</code>

std::thread_local 变量

被thread_local修饰的变量存在于整个线程周期,在线程开始时被生成,在线程结束时被销毁

参考链接:https://www.cnblogs.com/pop-lar/p/5123014.html

std::mutex 互斥锁

用于保存某一线程中的重要区域(critical section),该区域内的代码必须在当前线程内连续执行,mutex会发出信号保证当前线程的该段代码能够独占资源,等运行完之后再解锁。

<code>

// mutex example

#include <iostream>      // std::cout

#include <thread>        // std::thread

#include <mutex>          // std::mutex

std::mutex mtx;          // mutex for critical section

void print_block (int n, char c) {

  // critical section (exclusive access to std::cout signaled by locking mtx):

  mtx.lock();

  for (int i=0; i<n; ++i) { std::cout << c; }

  std::cout << '\n';

  mtx.unlock();

}

int main ()

{

  std::thread th1 (print_block,50,'*');

  std::thread th2 (print_block,50,'$');

  th1.join();

  th2.join();

  return 0;

}

output:

**************************************************

$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

</code>

若去掉互斥锁,则运行结果为:

$$$$$$$$$$$$$$$$$*$$**$**$*$*$$**$*$$*$*$*$*$*$*$*$*$***$*$***$*$***$*$$$*$*$**$*$$$*$**

************

在这个程序中,加上互斥锁之后使得两个线程顺序执行。

上一篇 下一篇

猜你喜欢

热点阅读