Man CPU_SET (3) CPU_XOR

Тип данни cpu_set_t реализиран като битова маска. Структурата на данните обаче трябва да се счита за „черна кутия“: всички действия с набори от процесори трябва да се извършват с помощта на макросите, описани на тази страница.

За работа с набор от процесори комплект предоставят се следните макроси:

CPU_ZERO() Почиства комплект, след това не съдържа процесор. CPU_SET() Добавя CPU процесор в комплект. CPU_CLR() Премахва процесора процесор на комплект. CPU_ISSET() Проверява дали CPU е процесор член на комплект. CPU_COUNT() Връща броя на процесорите в комплект.

Макроси като аргумент процесор, не причиняват странични ефекти, всички изброени по-горе макроси могат да използват аргумента повече от веднъж.

Стойността на първия процесор на системата в процесор означено като 0, следваща стойност на процесора в процесор е равно на 1 и т. н. Не може да се приеме, че има налични CPU или че набор от CPU е непрекъснат, тъй като CPU могат да бъдат динамично деактивирани или несъществуващи. Постоянно CPU_SETSIZE (в момента 1024) е зададено на 1 по-голямо от максималния номер на процесора, който може да се съхранява cpu_set_t.

Следните макроси изпълняват логически операции върху набори от процесори:

CPU_AND() Запазва пресичането на множества srcset1 и srcset2 в десет (което може да бъде един от наборите аргументи). CPU_OR() Запазва обединението на множества srcset1 и srcset2 в десет (което може да бъде един от наборите аргументи). CPU_XOR() Запазва резултата от XOR набори srcset1 и srcset2 в десет (което може да бъде един от наборите аргументи). Операцията XOR връща набор от процесори, които са в един от srcset1 или srcset2, но не и двете едновременно. CPU_EQUAL() Проверява дали два комплекта CPU съдържат едни и същи CPU.

Динамично преоразмеряващи се CPU комплекти

Следните макроси се използват за избор и премахване на набори от процесори:

CPU_ALLOC() Разпределя набор от процесори, достатъчни да държат процесори в диапазона от 0 до num_cpus-1. CPU_ALLOC_SIZE() Връща размера на набор от процесори в байтове, който е необходим за задържане на процесора в диапазона от 0 до num_cpus-1. Този макрос предоставя стойност, която може да се използва в аргумент определя размера в макроси CPU _ * _ S(), описани по-долу. CPU_FREE() Пуска набор от процесори, предварително разпределени с CPU_ALLOC().

Макросите, чиито имена завършват на "_S", са същите като макросите със същото име без суфикс. Тези макроси изпълняват същите задачи като техните аналози, но те работят върху динамично разпределени набори от процесори, които са определя размера байт.

ВЪРНАТА СТОЙНОСТ

Макроси CPU_COUNT() и CPU_COUNT_S() връща броя на процесорите в комплект.

Макроси CPU_EQUAL() и CPU_EQUAL_S() връща ненулево, ако два комплекта процесори са еднакви; в противен случай се връща 0.

При успех, макро CPU_ALLOC() връща указател, при грешка се връща NULL (грешките са същите като за malloc(3)).

Макро CPU_ALLOC_SIZE() връща броя на байтовете, необходими за съхранение на процесора на посочените елементи.

Други функции не връщат никакви стойности.

Макро CPU_COUNT() за първи път се появи във версия 2.6 на glibc.

Макроси CPU_AND(), CPU_OR(), CPU_XOR(), CPU_EQUAL(), CPU_ALLOC(), CPU_ALLOC_SIZE(), CPU_FREE(), CPU_ZERO_S(), CPU_SET_S(), CPU_CLR_S(), CPU_ISSET_S(), CPU_AND_S(), CPU_OR_S(), CPU_XOR_S() и CPU_EQUAL_S() за първи път се появи във версия 2.7 на glibc.

СЪОТВЕТСТВИЕ

Тъй като CPU наборите са битови маски, разпределени в единици дълги думи, действителният брой CPU в динамично разпределен CPU набор ще бъде закръглен до следващото кратно sizeof (неподписан дълъг). Приложението трябва да разглежда съдържанието на тези допълнителни битове като неопределено.

Въпреки сходството на имената, обърнете внимание, че константата CPU_SETSIZE определя броя на процесорите в типа данни cpu_set_t (т.е. ефективният брой битове в битовата маска), докато аргументът определя размера макроси CPU _ * _ S() Е размерът в байтове.

Типовете данни за параметрите и върнатите стойности, показани в ОБЗОР, са подсказки за това какво се очаква във всеки отделен случай. Тъй като обаче тези интерфейси са внедрени като макроси, компилаторът не е задължително да улавя всички грешки в typecast, ако нарушите предположенията.