我被告知insert()
中的代码不是线程安全的,因为交织的线程可以在另一个线程之后将head
设置为node
,从而有效地丢失到一个节点的链接。但是无论我运行多少次这个程序,我都会将2
作为节点数而不是1
。那是为什么?
#include <functional>
#include <iostream>
#include <thread>
#include <chrono>
struct List
{
struct Node
{
int data{0};
Node* next{0};
};
Node* head{0};
void insert(int n)
{
Node* node = new Node{n};
node->next = head;
head = node;
}
};
int Count(List& list)
{
int count = 0;
for (List::Node* head = list.head; head != nullptr; head = head->next)
count++;
return count;
}
int main()
{
List i;
std::thread t1(&List::insert, &i, 5);
std::thread t2(&List::insert, &i, 3);
t1.join();
t2.join();
std::cout << Count(i);
}