Quantcast
Channel: std::atomic to what extent? - Stack Overflow
Viewing all articles
Browse latest Browse all 3

std::atomic to what extent?

$
0
0

In the C++ Seasoning video by Sean Parent https://youtu.be/W2tWOdzgXHA at 33:41 when starting to talk about “no raw synchronization primitives”, he brings an example to show that with raw synchronization primitives we will get it wrong. The example is a bad copy on write class:

template <typename T>class bad_cow {    struct object_t {        explicit object_t(const T& x) : data_m(x) { ++count_m; }        atomic<int> count_m;        T data_m;    };    object_t* object_m;public:    explicit bad_cow(const T& x) : object_m(new object_t(x)) { }    ~bad_cow() { if (0 == --object_m->count_m) delete object_m; }    bad_cow(const bad_cow& x) : object_m(x.object_m) { ++object_m->count_m; }    bad_cow& operator=(const T& x) {        if (object_m->count_m == 1) {            // label #2            object_m->data_m = x;         } else {            object_t* tmp = new object_t(x);            --object_m->count_m; // bug #1            // this solves bug #1:            // if (0 == --object_m->count_m) delete object_m;            object_m = tmp;        }        return *this;    }};

He then asks the audience to find the bug, which is the bug #1 as he confirms.

But a more obvious bug I guess, is when some thread is about to proceed to execute a line of code that I have denoted with label #2, while all of a sudden, some other thread just destroys the object and the destructor is called, which deletes object_m. So, the first thread will encounter a deleted memory location.

Am I right? I don’t seem so!


Viewing all articles
Browse latest Browse all 3

Latest Images

Trending Articles



Latest Images