статическая переменная с многопоточностью - PullRequest
0 голосов
/ 23 апреля 2011

У меня многопоточный код на C, я хочу сделать глобальную переменную частной.То есть каждый поток имеет свою собственную копию ... каков наилучший способ сделать это?

Ответы [ 3 ]

5 голосов
/ 23 апреля 2011

То, что вы хотите, называется TLS .TLS объявляется как любая другая глобальная (статическая) переменная, но синтаксис зависит от реализации.Например:

// Visual C/C++ and Intel C/C++ on Windows
__declspec(thread) int number;

// GCC and Intel C/C++ on Linux
__thread int number;

Boost и TBB имеют свои собственные переносимые TLS, но это C ++, а не C.

1 голос
/ 28 апреля 2011

Для движка Windows NT возможно передать указатель на поток, когда он запускается. Этот указатель может указывать на все, на что можно указать: в вашем случае переменная.

Лично я предпочитаю, чтобы он указывал на член индексированной структуры, где каждый член относится к определенному потоку и содержит информацию, относящуюся к потоку, такую ​​как дескриптор, статистика обработки и т. Д.

Если вы идете по этому пути, помните, что каждый член индексированной структуры должен иметь размер, равный четному кратному размеру строки кэша процессора (32 или 64 байта на x86), иначе потоки начнут сталкиваться друг с другом в кэш при доступе к их соответствующим структурам. Индексированная структура также должна начинаться с четного кратного размера строки кэша.

0 голосов
/ 23 апреля 2011

Вы описываете локальные переменные, а не глобальные переменные.

Это легко упорядочить, превратив переменную в экземплярную переменную, используя идиомы C, например, передав параметр в поток.

...