Интересно, почему мы не можем передавать объекты по значению функциям, которые мы создаем потоки.pthread_create: Передача аргумента по значению
Есть ли логическая причина этого? Было бы вредно, если бы язык позволял проходить по значению?
Интересно, почему мы не можем передавать объекты по значению функциям, которые мы создаем потоки.pthread_create: Передача аргумента по значению
Есть ли логическая причина этого? Было бы вредно, если бы язык позволял проходить по значению?
pthread
- это интерфейс стиля C. Чтобы обеспечить большую гибкость, чем «передать целое число», он должен быть указателем. A void *
- самый гибкий способ передать произвольные вещи в C. В C вы можете, конечно, передать struct
по значению, но какая структура должна быть известна как исходной, так и целевой функцией во время компиляции (и то же самое каждый поэтому мы не можем использовать struct X
в одном из наших потоков, а struct Y
в другом потоке).
В C++ мы можем, конечно, использовать классы и шаблоны, чтобы почти все было передано почти любому типу функции.
C++ 11 std::thread
позволяет использовать различные вещи стиля C++ для преодоления «C-ness» pthreads (и с учетом доступной реализации для целевой системы, используйте потоки без pthreads).
[Это не единственно для pthreads
. Обе реализации OS/2 и Windows принимают void *
в качестве аргумента функции потока]
Пони POSIX - это API C. C не предоставляет языковых средств, таких как конструкторы копирования, и поэтому невозможно скопировать любой объект по значению без дополнительной информации (т. Е. Передать функцию, которая знает тип и может выполнять задание по распределению памяти и копированию данных). Однако этот API был бы чрезмерно сложным без уважительной причины.
При этом вы можете передать любой объект по значению, если его размер не превышает sizeof(void *)
.
Поскольку вы отметили свой вопрос как C++, C++ позволяет передавать функцию с таким количеством аргументов, сколько вы хотите с помощью вариативных шаблонов. См. std::thread
для получения более подробной информации.
Аргумент pthread_create
вводится как указатель, чтобы быть как можно более гибким, но это не означает, что вы не можете передать int
. Просто верните его обратно в int
в start_routine
. Пока аргумент переданного значения меньше указателя, вы должны быть в порядке.