Если я правильно вас понял, то под
бе семафор
вы имели в виду мьютекс.
add_executable(2sem_main main.c)
Нет.
Use the CPUID instruction for processor identification in the Pentium M processor family,
Pentium 4 processor family, Intel Xeon processor family, P6 family, Pentium processor,
and later Intel486 processors.
...
The CPUID instruction is not available in earlier IA-32 processors up through
the earlier Intel486 processors. For these processors, several other architectural
features can be exploited to identify the processor.
...
ЕМНИП - на Pentium это закончилось
movb $4, %al
в синтаксисе интел. В моём ответе присутвтсвуют оба варианта (intel и AT&T) этой инструкции, результат их ассемблирования одинаковый -- 0xb0, 0x04
.Vol. 2B 4-35
можно найти все возможные инструкции mov и их двоичные представления. 0xb0, 0x04 -- загрузка непосредственного операнда в регистр. 0xa0 -- загрузка регистра AL из памяти по абсолютному адресу.оно там libc libgcc libstd и ещё всякий библиотек по подключет
-S
поставил, с ним gcc сгенерирует код на ассемблере -- текстовый файл (даже с некоторыми комментариями, если добавить -fverbose-asm), исключительно из твоего текста на C. к уменьшению объема программы
Enter your assembly code using Intel syntax below.
, к чему эти movb? mov %al, 4
там сказали:Assembly
Raw Hex (zero bytes in bold):
B004
String Literal:
"\xB0\x04"
Array Literal:
{ 0xB0, 0x04 }
Disassembly:
0: b0 04 mov al,0x4
Василий Дёмин, так делать неправильно, потому что conditional не гарантирует, что произошло именно то событие, которого ты ожидал. Нужно проверять под мьютексом что да, событие произошло, а если нет -- возвращаться к ожиданию.
Кроме этого, в приведённом коде есть гонка между потоками выполняющими worker и основным потоком -- если основной поток просигналит в cond до того, как воркеры встанут на ожидание, они будут стоять на ожидании до следующего cond_broadcast.
Использование семафора решает обе эти проблемы.