C++并发编程学习01——hello concurrent world

news/2024/7/3 17:39:26

经典用例

#include <iostream>
#include <thread>

void hello()
{
    std::cout << "hello concurrent world" << std::endl;
}

int main()
{
    std::thread t(hello);
    t.join();
}

编译

g++ -g test.cpp -o out -lpthread

gdb调试

(gdb) r
Starting program: /usr1/code/ch1/out 
Missing separate debuginfos, use: zypper install glibc-debuginfo-2.22-100.15.4.x86_64
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
[New Thread 0x7ffff6f79700 (LWP 17902)]
hello concurrent world
[Thread 0x7ffff6f79700 (LWP 17902) exited]
[Inferior 1 (process 17898) exited normally]
Missing separate debuginfos, use: zypper install libgcc_s1-debuginfo-8.2.1+r264010-1.3.3.x86_64 libstdc++6-debuginfo-8.2.1+r264010-1.3.3.x86_64
(gdb) c
The program is not being run.
(gdb) info threads 
No threads.
(gdb) b dm_01_01.cpp:11
Breakpoint 1 at 0x400d53: file dm_01_01.cpp, line 11.
(gdb) r
Starting program: /usr1/code/ch1/out 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".

Breakpoint 1, main () at dm_01_01.cpp:11
11          std::thread t(hello);
(gdb) n
[New Thread 0x7ffff6f79700 (LWP 18588)]
hello concurrent world
[Thread 0x7ffff6f79700 (LWP 18588) exited]
12          t.join();
(gdb) info threads 
  Id   Target Id                               Frame 
* 1    Thread 0x7ffff7fda740 (LWP 18504) "out" main () at dm_01_01.cpp:12
(gdb) d
Delete all breakpoints? (y or n) y
(gdb) b dm_01_01.cpp:6
Breakpoint 2 at 0x400d2b: file dm_01_01.cpp, line 6.
(gdb) c
Continuing.
[Inferior 1 (process 18504) exited normally]
(gdb) r
Starting program: /usr1/code/ch1/out 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
[New Thread 0x7ffff6f79700 (LWP 18896)]
[Switching to Thread 0x7ffff6f79700 (LWP 18896)]

Thread 2 "out" hit Breakpoint 2, hello () at dm_01_01.cpp:6
6           std::cout << "hello concurrent world" << std::endl;
(gdb) info threads 
  Id   Target Id                               Frame 
  1    Thread 0x7ffff7fda740 (LWP 18895) "out" 0x00007ffff7bc7a0d in pthread_join ()
   from /lib64/libpthread.so.0
* 2    Thread 0x7ffff6f79700 (LWP 18896) "out" hello () at dm_01_01.cpp:6
(gdb) c
Continuing.
hello concurrent world
[Thread 0x7ffff6f79700 (LWP 18896) exited]
[Inferior 1 (process 18895) exited normally]
(gdb) q

代码中注意点

  • 管理线程的函数和类在<thread>中声明,而保护共享数据的函数和类在其他
    头文件中声明
  • 每个线程都必须具有一个初始函数(initial function),新线程的执行从这个函数开始。对于应用程序来说,初始线程是main(),但是对于其他线程,可以在 std::thread 对象的构造函数中指定——本例中,被命名为 t 的 std::thread 对象使用新函数 hello()作为其初始函数。
  • 与直接写入标准输出或是从 main()调用 hello()不同,该程序启动了一个新的线程来实现,使线程数量增加到两个——初始线程始于 main(),而新线程始于hello()
  • 新的线程启动后,初始线程继续执行。如果它不等待新线程结束,它就将继续运行到main()的结尾,从而结束程序——这有可能发生在新线程运行之前。这就是为什么在这里调用 join()的原因,这会使得调用线程(在 main()中)等待与 std::thread
    对象相关联的线程,即这个例子中的 t。

http://lihuaxi.xjx100.cn/news/1470034.html

相关文章

广度优先搜索(BFS)算法详解与Java实现

广度优先搜索&#xff08;BFS&#xff09;算法详解与Java实现 在计算机科学中&#xff0c;搜索算法用于在数据集合中查找特定元素或解决问题。广度优先搜索&#xff08;BFS&#xff09;是一种重要的图搜索算法&#xff0c;它从起始节点开始&#xff0c;逐层地探索其邻居节点&a…

(三)行为模式:5、中介者模式(Mediator Pattern)(C++示例)

目录 1、中介者模式&#xff08;Mediator Pattern&#xff09;含义 2、中介者模式的UML图学习 3、中介者模式的应用场景 4、中介者模式的优缺点 &#xff08;1&#xff09;优点 &#xff08;2&#xff09;缺点 5、C实现中介者模式的实例 1、中介者模式&#xff08;Media…

平板用的触控笔什么牌子好?开学必买电容笔清单

开学季马上就要到来了&#xff0c;自从iPad的Pencil火了之后&#xff0c;国内又陆续推出了一些新的产品&#xff0c;比如平替之类的&#xff0c;有的质量非常好&#xff0c;有的价格非常实惠&#xff0c;还能被大多数人所接受。不过&#xff0c;这里面有不少的产品&#xff0c;…

261 migo过账--工单发料 demo

261 migo过账–工单发料 demo goodsmvt_code 03.move_type 261.LOOP AT req_item.CALL FUNCTION CONVERSION_EXIT_ALPHA_INPUTEXPORTINGinput req_item-aufnrIMPORTINGoutput pro_noEXCEPTIONSOTHERS 1.goodsmvt_item-item_text tr_code.CLEAR tr_code.goodsmvt_item-ma…

js计算一串数字最长子链长度

假设有一串字符串"186 186 150 200 160 130 197 200"&#xff1b;现在求它的最长升序子串长度。 let str "186 186 150 200 160 130 197 200";let arr str.split(" "); // 转化为数组let arrLeft []; // 存储每个数左边小于其的数的个数for(l…

【Linux】网络层协议:IP

我们必须接受批评&#xff0c;因为它可以帮助我们走出自恋的幻象&#xff0c;不至于长久在道德和智识上自我陶醉&#xff0c;在自恋中走向毁灭&#xff0c;事实上我们远比自己想象的更伪善和幽暗。 文章目录 一、IP和TCP之间的关系&#xff08;提供策略 和 提供能力&#xff09…

DBIDRespOrd/DBIDResp的区别

DBIDResp: □ 用来通知requester, buffer资源已经可用了&#xff0c;可以接受writedata; □ 用来表示completer对这个请求已经保序处理&#xff1b; □ 在write, combined write, DVMOp, Atomic中使用&#xff1b; □ 用在如下节点之间&#xff1a; □ HN<->RN; □ S…

html写一个向flask_socketio发送消息和接收消息并显示在页面上

以下是一个简单的HTML页面&#xff0c;它包含一个输入框、一个发送按钮和一个显示区域。用户可以在输入框中输入消息&#xff0c;点击发送按钮&#xff0c;然后这个消息会被发送到 Flask-SocketIO 服务器。当服务器回应消息时&#xff0c;它会在页面的显示区域显示出来。 <…