Имеется класс очереди запросов 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 может быть предпочтителен к выбору конкретно в ситуации с примером из моего вопроса?
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Как можно поставить свой QGridLayout в окно, наследующее от QMdiSubWindow? Попытка простого setLayout() выдаёт ворнинг, мол окно уже имеет свой layout
Не выводится окно ввода
Есть форма в QtCreator, на ней lineEdit и кнопкиКак сделать, чтобы lineEdit всегда оставался в фокусе (чтобы каретка мигала), независимо от нажатий на кнопки,...
Сейчас моё обращение к БД выглядит так: