Я изучаю атомарность и системный вызов фьютекса; и я пытаюсь реализовать свою собственную (простую) блокировку ради развлечения.
Реализация приведена ниже, и, похоже, здесь есть проблема.
Я ожидаю, что глобальное значение всегда будет 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
Несколько потоков получают блокировку на основе фьютекса с использованием атомики C11? ⇐ C++
Программы на C++. Форум разработчиков
1735085749
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
Подробнее здесь: [url]https://stackoverflow.com/questions/79306662/multiple-threads-acquiring-futex-based-lock-using-c11-atomics[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия