交织的线程影响链表

时间:2014-12-03 17:21:44

标签: c++ multithreading thread-safety

我被告知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);
}

Demo

0 个答案:

没有答案