Я склоняюсь к использованию векторов и интеллектуальных указателей вместо массивов, так как это безопаснее. Проблема в том, что при инициализации в виде массива мои потоки успешно присоединяются к основному потоку. Однако это не тот случай, когда он инициализируется как вектор. Это ожидается, поскольку доступ к элементам массива осуществляется по ссылке.
1. В виде массива
pthread_t threads[numCPU]; // Initialised as an array
// Creating threads
for(long unsigned int i=0; i<numCPU; i++){
rc = pthread_create(&threads[i], &attr, myfunc, (void *) args[i] );
if (rc) {
printUserMessage(std::string("Error; return code from pthread_create is : ") + std::to_string(rc));
} else {
printUserMessage(std::string("Created Thread " + std::to_string(i)));
}
}
// Joining thread
for(long unsigned int i=0; i<numCPU;i++){
rc = pthread_join(threads[i], NULL);
if (rc) {
printUserMessage(std::string("Error; return code from pthread_create is : ") + std::to_string(rc));
} else {
printUserMessage(std::string("Joined Thread " + std::to_string(i)));
}
Сигнатуры pthread_create и pthread_join будут соблюдаться, когда:
std::vector<pthread_t *> threads(numCPU);
Вектор указателей не имеет смысла, и мне, возможно, придется управлять памятью . Есть ли более безопасный способ создания потоков?