Я собираюсь сделать здесь предположение, что thread_p представляет собой процедуру запуска pthread_create. Такая процедура запуска требуется для принятия указателя void, который в C и C++ означает указатель на нетипизированный блок памяти. Теперь, в дополнение к начальной процедуре, pthread_create также принимает аргумент указателя void, который он передает в начальную процедуру. Для вызова вызова pthread_create с кодом в начальной процедуре зависит от вызывающего пользователя pthread_create. Поэтому, если начальная процедура, заданная pthread_create, предполагает, что указатель void указывает на, скажем, целое число, тогда вызов pthread_create должен передать указатель на целое число в качестве параметра arg, чтобы синхронизировать ситуацию. Это небезопасный интерфейс типа. Компилятор не поможет вам убедиться, что они синхронизированы, а если нет, вы получите неопределенное поведение.
Ваша функция thread_p предполагает, что переданный ей аргумент фактически указывает на целое число. Сначала он набирает указатель void на целочисленный указатель (то есть часть (int *) args), а затем разыгрывает указатель, чтобы получить целое число, на которое он указывает (это * перед аргументами (int *)). Если вызывающий объект pthread_create передал ему thread_p, но не смог передать адрес int в качестве параметра arg, код имел бы неопределенное поведение.
Это не имеет никакого отношения к многопоточности, но все с использованием языка программирования, который вы используете. Это именно так? При этом, считая C, правая часть оценивается как '* ((int *) args)', то есть сначала отбрасывается на 'int *', затем разыгрывается. –
Другими словами, sid присваивается значение int, на которое указывает args. Предполагается, что args указывает на адрес, где хранится значимый int. –
Это означает, что вы читаете 'sizeof (int)' bytes из адреса, на который указывает 'args', и записывая эти байты в локальную переменную' sid'. Если адрес, на который указывает 'args', не привязан к' int' (т. Е. Не делится на 'sizeof (int)') ** И ** ваша платформа (компилятор + HW) не поддерживает операции выравнивания нагрузки/хранения, то это приведет к ошибке во время выполнения (либо прямое ** нарушение доступа к памяти, либо, что еще хуже, вы получите некоторые «нежелательные» данные в переменной 'sid', и ваша программа будет вести себя неожиданно ** в некоторой случайной точке * * позже в исполнении). –