Упорядочение памяти (memory ordering) в QAtomicInteger

412
23 декабря 2016, 14:18

Имеется класс очереди запросов RequestQueue:

QQueue<Request> _requests;
QAtomicInt      _locker;
void RequestQueue::enqueue(const Request &request) {
    while(_locker.testAndSetOrdered(0,1) == false)
        QThread::yieldCurrentThread();
    _requests.enqueue(request);
    _locker = 0;
}
Request RequestQueue::dequeue() {
    forever {
        if(_locker.testAndSetOrdered(0,1) == true) {
            if(_requests.isEmpty() == true) {
                _locker = 0; break;
            }
            const Request request
                = _requests.dequeue();
            _locker = 0;
            return request;
        }
        QThread::yieldCurrentThread();
    }
    return Request();
}

Решил попробовать реализацию без мьютексов, поскольку имеется множество конкурирующих между собой потоков, как на запись в очередь, так и на чтение из оной, и хотелось получить максимально возможное ускорение.

Код работает корректно, однако смущает наличие непонимания того, какой следует использовать метод для test-and-set. В приведённом примере - это QAtomicInteger::testAndSetOrdered(), но почему бы вместо него не использовать, скажем, QAtomicInteger::testAndSetRelaxed() или ещё один из двух других оставшихся вариантов.

Справка не сильно многословна по этому поводу (впрочем, допускаю, что просто перевожу неверно):

QAtomicInteger provides several implementations of the atomic test-and-set, fetch-and-store, and fetch-and-add functions. Each implementation defines a memory ordering semantic that describes how memory accesses surrounding the atomic instruction are executed by the processor. Since many modern architectures allow out-of-order execution and memory ordering, using the correct semantic is necessary to ensure that your application functions properly on all processors.

Какой же из вариантов memory ordering может быть предпочтителен к выбору конкретно в ситуации с примером из моего вопроса?

READ ALSO
Свой layout в QMdiSubWindow

Свой layout в QMdiSubWindow

Как можно поставить свой QGridLayout в окно, наследующее от QMdiSubWindow? Попытка простого setLayout() выдаёт ворнинг, мол окно уже имеет свой layout

315
Qt: фокус lineEdit

Qt: фокус lineEdit

Есть форма в QtCreator, на ней lineEdit и кнопкиКак сделать, чтобы lineEdit всегда оставался в фокусе (чтобы каретка мигала), независимо от нажатий на кнопки,...

470
Qt SQLite Обращение к результатам select&#39;а через названия полей

Qt SQLite Обращение к результатам select'а через названия полей

Сейчас моё обращение к БД выглядит так:

311