Разница между вектором и массивом при инициализации p_threads - PullRequest
0 голосов
/ 28 мая 2020

Я склоняюсь к использованию векторов и интеллектуальных указателей вместо массивов, так как это безопаснее. Проблема в том, что при инициализации в виде массива мои потоки успешно присоединяются к основному потоку. Однако это не тот случай, когда он инициализируется как вектор. Это ожидается, поскольку доступ к элементам массива осуществляется по ссылке.

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);

Вектор указателей не имеет смысла, и мне, возможно, придется управлять памятью . Есть ли более безопасный способ создания потоков?

1 Ответ

1 голос
/ 28 мая 2020

Я предпочитаю использовать векторы и умные указатели вместо массивов, так как это безопаснее.

Векторы и интеллектуальные указатели не безопаснее, чем массивы.

Использование вектора вместо массива было бы полезно, если вы хотите, чтобы количество потоков определялось во время выполнения, без постоянный верхний предел. В противном случае это бесполезно.

Непонятно, зачем вам создавать вектор указателей.

...