c++多线程注意事项

一 多线程需要的编译选型

g++ -std=c++11 hello.cpp -o hello -lpthread

如果不加-lpthread,则会碰到问题

 /tmp/ccGd5Yww.o: In function `std::thread::thread<void (&)()>(void (&)())':
hello.cpp:(.text._ZNSt6threadC2IRFvvEJEEEOT_DpOT0_[_ZNSt6threadC5IRFvvEJEEEOT_DpOT0_]+0x21): undefined reference to `pthread_create'
collect2: error: ld returned 1 exit status

二 线程启动 

2.1 线程构造函数

有件事需要注意,当把函数对象传入到线程构造函数中时,需要避免“最令人头痛的语法解析”(C++’s most vexing parse中文简介)。如果你传递了一个临时变量,而不是一个命名的变量;C++编译器会将其解析为函数声明,而不是类型对象的定义。

例如:

std::thread my_thread(background_t

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在使用多线程编程时,需要注意以下几点: 1. 线程之间的同步问题。多个线程可能同时访问共享的变量或资源,需要使用同步机制来避免竞争条件。例如,使用互斥锁、条件变量、信号量等来控制线程的访问。 2. 线程的优先级问题。默认情况下,所有线程的优先级都是相同的。但是如果需要控制线程的执行顺序,可以设置不同的优先级。需要注意的是,过高的优先级可能会导致其他线程无法得到执行的机会,从而导致死锁等问题。 3. 线程的创建和销毁问题。线程的创建和销毁可能涉及到资源的申请和释放,需要注意线程的生命周期问题。例如,在创建线程时需要分配堆栈空间,需要在线程退出时释放该空间。 4. 线程的异常处理问题。如果线程中发生异常,需要确保异常能够被正确处理,避免程序崩溃或者资源泄漏等问题。可以使用try-catch语句来捕获异常,或者使用异常安全的编程技术来保证程序的健壮性。 例如,下面是一个简单的多线程程序,它创建了两个线程来计算1~100的和,并使用互斥锁来同步线程之间的访问。 ```c++ #include <iostream> #include <thread> #include <mutex> using namespace std; mutex mtx; int sum = 0; void calc_sum(int start, int end) { int local_sum = 0; for (int i = start; i <= end; i++) { local_sum += i; } mtx.lock(); sum += local_sum; mtx.unlock(); } int main() { thread t1(calc_sum, 1, 50); thread t2(calc_sum, 51, 100); t1.join(); t2.join(); cout << "sum = " << sum << endl; return 0; } ``` 在这个程序中,我们使用了互斥锁来保证sum变量的线程安全,避免了竞争条件的问题。同时,使用了join()函数来等待线程的结束,避免了线程的资源泄漏问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

youzjuer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值