基础代码
t1线程首先执行 DoIt ,并将链表最后一个元素传入进去,然后轮询is_l,
t2线程首先休眠3秒(保证1线程先跑),然后将链表中值为3和5的元素删除,置is_l为1。
t1此时轮询结束,查看i1的值,由于t2已经将5给删除了,那么t1在这之后访问值为5的元素还能成功吗?
bool is_l = false;
void DoIt(std::shared_ptr<int> &i1) {
while (!is_l) {
}
std::cout << "loop: " << i1 << std::endl; // loop: 0x562e787763b0
std::cout << *i1 << std::endl;
}
/** IS, IS, X integration test */
void MyPointTest() {
// 定义一个 全局链表
std::list<std::shared_ptr<int>> l1;
// 插入数据
l1.push_back(std::make_shared<int>(1));
l1.push_back(std::make_shared<int>(2));
l1.push_back(std::make_shared<int>(3));
l1.push_back(std::make_shared<int>(4));
l1.push_back(std::make_shared<int>(5));
// 定义两个线程
std::thread t_1([&]{
DoIt(l1.back());
});
std::thread t_2([&]{
// 线程2 休眠一会,然后再启动并且执行一些操作
std::this_thread::sleep_for(std::chrono::seconds(3));
for(auto it=l1.begin();it!=l1.end();++it){
if(**it==3){
l1.erase(it);
break;
}
}
for(auto it=l1.begin();it!=l1.end();++it){
if(**it==5){
std::cout << "5: " << *it << std::endl