Является ли удаление потокобезопасным? - PullRequest
0 голосов
/ 22 января 2019
int *p = new int;
// delete p in thread 1
// delete p in thread 2

Я знаю, что make p равно nullptr - хорошее поведение, но сейчас я просто хочу знать, является ли delete поточно-ориентированным? Нужно ли использовать замок для случая выше?

Да, я удаляю один и тот же объект дважды.

Это связано с тем, что я обнаружил, что delete p дважды в одном потоке вызовет ошибку дампа ядра, тогда как delete p два раза в двух потоках не может выдать ошибку.

Я знаю, что двойное удаление - это UB, поэтому я хочу знать, является ли delete поточно-ориентированным, что означает, что если мы введем функцию delete дважды одновременно, мы будем в безопасности, потому что она является поточно-поточной. сейф.

1 Ответ

0 голосов
/ 22 января 2019

Вы можете использовать следующий подход для достижения желаемого с помощью механизма синхронизации: убедитесь, что удаление p и установка его на nullptr может выполняться только одним потоком в данный момент:

// multiple threads
// ...
// single thread (critical region)
delete p;
p = nullptr;
// multiple threads
// ...

Таким образом, второе удаление другим потоком ничего не делает, так как nullptr будет тем, что будет передано delete.

...