Почему изменение pthread_attr_t из pthread_getattr_default_np () влияет на атрибуты по умолчанию?Linux

Ответить
Anonymous
 Почему изменение pthread_attr_t из pthread_getattr_default_np () влияет на атрибуты по умолчанию?

Сообщение Anonymous »

Я наблюдаю неожиданное поведение при использовании pthread_getattr_default_np () в сочетании с pthread_attr_setaffinity_np () on linux.
I переопределяет атрибуты потока по умолчанию с использованием cpute stribine с использованием c -cpu. Позже я получаю атрибуты по умолчанию с помощью pthread_getattr_default_np () , а затем изменяю аффинность ЦП, возвращаемого pthread_attr_t . Удивительно, но эта модификация, по -видимому, изменяет глобальную по умолчанию - хотя я никогда не вызываю pthread_setattr_default_np () снова.
Я использовал pthread_setattr_default_np () , чтобы установить атрибут потока по умолчанию с аффинностью CPU CPU. После этого я позвонил в pthread_getattr_default_np () , чтобы получить копию атрибутов по умолчанию в переменную (attr1). Затем я изменил аффинность процессора ATRT1 на CPU 3. Я предположил, что pthread_getattr_default_np () вернет правильную копию по умолчанию, поэтому изменение, это не повлияет на что -либо еще.attr2), я заметил, что у него также был только установлен CPU 3 - хотя я никогда не изменял attr2 напрямую. Это заставило меня думать, что по умолчанию может быть изменено непреднамеренно, когда я изменяю сродство ATTR1 .
Вот пример кода:
#include
#include

void display_pthread_attr(pthread_attr_t* attr, const char* label)
{
cpu_set_t cpuset;
int ret = pthread_attr_getaffinity_np(attr, sizeof(cpu_set_t), &cpuset);
if (ret != 0)
{
printf("%s: Failed to get CPU affinity (error %d)\n", label, ret);
return;
}

printf("%s CPU SET: ", label);
for (int i = 0; i < CPU_SETSIZE; ++i)
{
if (CPU_ISSET(i, &cpuset))
{
printf("%d ", i);
}
}
printf("\n");
}

void overrideDefaultThreadAttribute() {
pthread_attr_t* attribute = new pthread_attr_t;
pthread_attr_init(attribute);

cpu_set_t cpuSet;
pthread_getaffinity_np(pthread_self(), sizeof(cpuSet), &cpuSet);
pthread_attr_setaffinity_np(attribute, sizeof(cpu_set_t), &cpuSet);

pthread_setattr_default_np(attribute);

display_pthread_attr(attribute, "OverrideDefaultThreadAttribute");
}

int main() {
overrideDefaultThreadAttribute();

pthread_attr_t attr1, attr2;

pthread_getattr_default_np(&attr1);
display_pthread_attr(&attr1, "Default attr1");

// Modify attr1
cpu_set_t cpus;
CPU_ZERO(&cpus);
CPU_SET(3, &cpus);
pthread_attr_setaffinity_np(&attr1, sizeof(cpu_set_t), &cpus);
display_pthread_attr(&attr1, "attr1 pinned to 3");

// Get another default attribute
pthread_getattr_default_np(&attr2);
display_pthread_attr(&attr2, "Default attr2");
}
< /code>
output: < /p>
OverrideDefaultThreadAttribute CPU SET: 0 1 2 3 4 5 6 18 19 20 21 22 23 24
Default attr1 CPU SET: 0 1 2 3 4 5 6 18 19 20 21 22 23 24
attr1 pinned to 3 CPU SET: 3
Default attr2 CPU SET: 3


Подробнее здесь: https://stackoverflow.com/questions/796 ... affect-the
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»