Несколько потоков получают блокировку на основе фьютекса с использованием атомики C11?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Несколько потоков получают блокировку на основе фьютекса с использованием атомики C11?

Сообщение Anonymous »

Я изучаю атомарность и системный вызов фьютекса; и я пытаюсь реализовать свою собственную (простую) блокировку ради развлечения.
Реализация приведена ниже, и, похоже, здесь есть проблема.
Я ожидаю, что глобальное значение всегда будет 200,000 , однако при выполнении теста при нескольких запусках выводится 199,999.
Мое единственное первоначальное предположение состоит в том, что один из потоков неправильно сбрасывает обновленное значение «глобальный» в основную память. Однако все атомарные операции являются последовательными, поэтому я исключаю это.
Пожалуйста, дайте мне знать, если вы обнаружите какие-либо проблемы.
class Mutex2 {
public:
Mutex2() : mLock(0) {}

void lock() {
int expected = 0;
if (!atomic_compare_exchange_strong(&mLock, &expected, 1)) { // Attempt to acquire lock.
// Failed to acquire lock.
do {
// Go to sleep. Blocks...
// futex / FUTEX_WAIT does a load and compare atomically.
long retVal = syscall(SYS_futex, (uint32_t*) &mLock, FUTEX_WAIT, 1, nullptr, nullptr, nullptr);

// Either we were woken up during unlock() or we never slept,
// in which case, attempt to get the lock again.
} while (!atomic_compare_exchange_strong(&mLock, &expected, 1));
// Lock acquired.
}
}

void unlock() {
std::atomic_store(&mLock, 0);
syscall(SYS_futex, (uint32_t*) &mLock, FUTEX_WAKE, 1, nullptr, nullptr, nullptr);
}
private:
std::atomic_int mLock; // 0 means unlocked. 1 means locked.
};

// ===== TEST =====
//
Mutex2 mutex2
static int global = 0;
int main(int argc, char** argv) {
// Create two pthreads
// Make both increment a shared integer 100,000 times.
for (int i=0; i

Подробнее здесь: https://stackoverflow.com/questions/793 ... 11-atomics
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»