Для одного значения целочисленного типа, не превышающего intptr_t
, можно и довольно часто приводить его к указателю в вызове pthread_create
и возвращать его обратно в функции потока:
int main() {
pthread_t t1;
pthread_create(&t1, NULL, callback, (void *) 10);
pthread_join(t1, NULL);
return 0;
}
void *t1(void *arg) {
int arg_as_int = (int) arg;
// ...
}
Такое приведение определенно разрешено, и опять же, оно довольно условно.
Недавно я начал видеть возражения против этого подхода здесь, на SO, однако, на основании того, что стандарт C разрешает первое из этих приводит к получению представления ловушек, и для этого не требуется, чтобы обход от int
до void *
до int
сохранял значение. Этот аргумент правильно характеризует стандарт C, но он игнорирует тот факт, что с практической точки зрения подход приведения типов работает практически для каждой реализации C, которая в первую очередь поддерживает pthreads, и что он достаточно распространен, чтобы реализация который он не работал надежно, будет трудно принять.