2013-06-13 2 views

ответ

4

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 * в качестве аргумента функции потока]

2

Пони POSIX - это API C. C не предоставляет языковых средств, таких как конструкторы копирования, и поэтому невозможно скопировать любой объект по значению без дополнительной информации (т. Е. Передать функцию, которая знает тип и может выполнять задание по распределению памяти и копированию данных). Однако этот API был бы чрезмерно сложным без уважительной причины.

При этом вы можете передать любой объект по значению, если его размер не превышает sizeof(void *).

Поскольку вы отметили свой вопрос как C++, C++ позволяет передавать функцию с таким количеством аргументов, сколько вы хотите с помощью вариативных шаблонов. См. std::thread для получения более подробной информации.

2

Аргумент pthread_create вводится как указатель, чтобы быть как можно более гибким, но это не означает, что вы не можете передать int. Просто верните его обратно в int в start_routine. Пока аргумент переданного значения меньше указателя, вы должны быть в порядке.

Смежные вопросы