C++ 11 引入了线程库, #include <thread>
一般简单的,编写一个线程执行的函数,传递给thread去开启线程,就可以简单的实现多线程程序。
void WorkFun(int param)
{
...
for(int i = 0;i<4;i++)
{
cout<<param<<"Hello, other thread." <<n << endl;
}
...
}
int main()
{
thread t[4];
for(int i = 0;i<4;i++)
{
t[i] = thread(WorkFun,param);
}
}
多线程操作是抢占式执行,当多线程对某一个临界区资源进行访问或修改时,应该对临界区进行加锁,被锁所住的区域称为临界区。
例如上例中,cout标准输出流被多线程抢占式输出时,会造成打印结果乱序的结果。因此对其进行加锁。需要注意的是:频繁的加锁和解锁对性能的消耗是不可忽略的。
#include <mutex>
mutex m;
void WorkFun(int param)
{
...
for(int i = 0;i<4;i++)
{
m.lock();
cout<<param<<"Hello, other thread." <<n << endl;
m.unlock();
}
...
}
对临界区加了所之后,如果临界区内的代码出现异常,或其它原因导致没有解锁或解锁代码没有执行,那么会形成临界区资源无法释放,让其它线程会一直在加锁出阻塞。
因此,C++ 提供自解锁,对临界区的资源自动进行释放。自解锁的工作原理是:当自解锁的对象创建成功的时候,对它下面的代码进行加锁,当其生命周期结束的时,对加锁的临界区自动进行释放。
#include &l

C++11引入线程库,通过创建线程函数实现多线程。多线程抢占式执行时,需使用锁保护临界区资源,防止打印等操作乱序。自解锁能确保临界区资源在对象生命周期结束后自动释放,解决未解锁问题。原子操作提供不可分割的CPU操作,适用于简单共享操作,提高效率并保证安全性。在多线程中,原子类型是共享基本数据类型的安全选择。
最低0.47元/天 解锁文章
795

被折叠的 条评论
为什么被折叠?



