Существует ли различие между ограниченным по объему взаимным исключением Повышения и критическим разделом WinAPi?

Для очень простого и эффективного подхода используйте 256-байтовую таблицу поиска и выполните 2 поиска:

extern unsigned char const xtable[256];

unsigned int ref = 4149;
unsigned int rev = (xtable[ref & 0xFF] << 8) | xtable[ref >> 8];

Массив xtable можно статически инициализировать с помощью набора макросов:

#define S(x)  ((((x) & 0x0003) << 14) | (((x) & 0x000C) << 10) | \
               (((x) & 0x0030) <<  6) | (((x) & 0x00C0) <<  2) | \
               (((x) & 0xC000) >> 14) | (((x) & 0x3000) >> 10) | \
               (((x) & 0x0C00) >>  6) | (((x) & 0x0300) >>  2))
#define X8(m,n)   m((n)+0), m((n)+1), m((n)+2), m((n)+3), \
                  m((n)+4), m((n)+5), m((n)+6), m((n)+7)
#define X32(m,n)  X8(m,(n)), X8(m,(n)+8), X8(m,(n)+16), X8(m,(n)+24)

unsigned char const xtable[256] = {
    X32(S,   0), X32(S,  32), X32(S,  64), X32(S,  96),
    X32(S, 128), X32(S, 160), X32(S, 192), X32(S, 224),
};

#undef S
#undef X8
#undef X32

Если пространство не дорого, вы можете использовать один просмотр таблицы размером 128 КБ, которую вы будете вычислять во время запуска или генерировать с помощью скрипта и включать во время компиляции, но это несколько расточительно и не очень кэш удобно.

9
задан ThinkingStiff 30 June 2012 в 05:27
поделиться

2 ответа

Текущая версия boost :: mutex не использует ни Win32 CRITICAL_SECTION , ни Win32 Mutex. Вместо этого он использует атомарные операции и событие Win32 для блокировки ожидания.

Старые версии (boost 1.34.1 и ранее) были оболочкой вокруг CRITICAL_SECTION в Windows.

Между прочим, сам мьютекс является не ограничен. Тип boost :: mutex :: scoped_lock и, в последних версиях, boost :: lock_guard и boost :: unique_lock предоставляют оболочки RAII для блокировки мьютекса, чтобы вы не забыли его разблокировать.

boost :: lock_guard <> и boost :: unique_lock <>

20
ответ дан 4 December 2019 в 09:38
поделиться

CRITICAL_SECTION Win32 может использоваться только среди потоков одного процесса . Если вам нужно использовать что-то между процессами, вам понадобится мьютекс. Boost ничего не говорит о критических секциях, поэтому я предполагаю, что он использует мьютексы.

"scoped" просто означает, что у него есть оболочка, которая использует RAII для автоматической разблокировки мьютекса в конце определенной области.

2
ответ дан 4 December 2019 в 09:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: