题目:
子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,接着再回到主线程又循环 100 次,如此循环50次,试写出代码。
这里涉及到的问题是主线程和子线程之间的切换,也就是说子线程跑一下,然后阻塞,主线程再跑一下,然后在阻塞,如此各循环 50次,注意这里的“各循环”,因为主线程和子线程各自的循环是没有关系的,而是内部各自循环50次。
这里肯定要用到std::mutex
和原子操作std::atomic
,主要的实现思路就是,原子变量的值符合要求,就开始循环,否则阻塞等着。
主线程代码:
for(int i = 0; i < 50; ++i)
{
lock_guard<mutex> lck(mt);
if(flag % 2 == 1){
for(int i = 0; i < 100; ++i)
cout << "parent thread: " << i << endl;
flag++;
}
}
子线程代码:
for(int i = 0; i < 50; ++i){
lock_guard<mutex> lck(mt);
if(flag % 2 == 0){
for(int i = 0; i < 10; ++i)
cout << "child thread: " << i << endl;
flag++;
}
}
完整代码如下:
#include <iostream>
#include <thread>
#include <mutex>
#include <atomic>
using namespace std;
mutex mt;
atomic<int> flag = 0;
void func()
{
for(int i = 0; i < 50; ++i){
lock_guard<mutex> lck(mt);
if(flag % 2 == 0){
for(int i = 0; i < 10; ++i)
cout << "child thread: " << i << endl;
flag++;
}
}
}
int main()
{
thread t1(func);
for(int i = 0; i < 50; ++i)
{
lock_guard<mutex> lck(mt);
if(flag % 2 == 1){
for(int i = 0; i < 100; ++i)
cout << "parent thread: " << i << endl;
flag++;
}
}
t1.join();
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)