Возможно, я запутался в потоках, но мое понимание потоков конфликтует между собой.Если программа pthread занимает больше времени
Я создал программу, которая использует POSIX pthread
s. Без использования этих потоков программа занимает 0.061723 секунды для запуска, а потоки - 0.081061 секунды для запуска.
Сначала я подумал, что это то, что должно произойти, поскольку потоки позволяют чему-то случиться, в то время как другие вещи должны быть в состоянии. то есть обрабатывать большое количество данных в одном потоке, сохраняя при этом еще один отзывчивый интерфейс, это будет означать, что обработка данных займет больше времени, поскольку процессор делит свое время между обработкой пользовательского интерфейса и обработкой данных.
Однако, конечно, точка многопоточности заключается в том, чтобы программа использовала преимущества нескольких процессоров/ядер?
Как вы можете сказать, я что-то среднее, поэтому извините меня, если это простой вопрос.
Но что я должен ожидать от программы?
Я запускаю это в середине 2012 года Macbook Pro 13 "базовой модели. Процессор 22 нм «Ivy Bridge» 2,5 ГГц Intel «Core i5» процессор (3210M), с двумя независимыми процессор «сердечников» на одном кристалле кремния
ОБНОВЛЕНИЕ С КОДОМ
Это в основная функция. Я не добавить объявление переменной для удобства, но я уверен, что вы можете выяснить, что каждый делает его именем:
// Loop through all items we need to process
//
while (totalNumberOfItemsToProcess > 0 && numberOfItemsToProcessOnEachIteration > 0 && startingIndex <= totalNumberOfItemsToProcess)
{
// As long as we have items to process...
//
// Align the index with number of items to process per iteration
//
const uint endIndex = startingIndex + (numberOfItemsToProcessOnEachIteration - 1);
// Create range
//
Range range = RangeMake(startingIndex,
endIndex);
rangesProcessed[i] = range;
// Create thread
//
// Create a thread identifier, 'newThread'
//
pthread_t newThread;
// Create thread with range
//
int threadStatus = pthread_create(&newThread, NULL, processCoordinatesInRangePointer, &rangesProcessed[i]);
if (threadStatus != 0)
{
std::cout << "Failed to create thread" << std::endl;
exit(1);
}
// Add thread to threads
//
threadIDs.push_back(newThread);
// Setup next iteration
//
// Starting index
//
// Realign the index with number of items to process per iteration
//
startingIndex = (endIndex + 1);
// Number of items to process on each iteration
//
if (startingIndex > (totalNumberOfItemsToProcess - numberOfItemsToProcessOnEachIteration))
{
// If the total number of items to process is less than the number of items to process on each iteration
//
numberOfItemsToProcessOnEachIteration = totalNumberOfItemsToProcess - startingIndex;
}
// Increment index
//
i++;
}
std::cout << "Number of threads: " << threadIDs.size() << std::endl;
// Loop through all threads, rejoining them back up
//
for (size_t i = 0;
i < threadIDs.size();
i++)
{
// Wait for each thread to finish before returning
//
pthread_t currentThreadID = threadIDs[i];
int joinStatus = pthread_join(currentThreadID, NULL);
if (joinStatus != 0)
{
std::cout << "Thread join failed" << std::endl;
exit(1);
}
}
функции обработки:
void processCoordinatesAtIndex(uint index)
{
const int previousIndex = (index - 1);
// Get coordinates from terrain
//
Coordinate3D previousCoordinate = terrain[previousIndex];
Coordinate3D currentCoordinate = terrain[index];
// Calculate...
//
// Euclidean distance
//
double euclideanDistance = Coordinate3DEuclideanDistanceBetweenPoints(previousCoordinate, currentCoordinate);
euclideanDistances[index] = euclideanDistance;
// Angle of slope
//
double slopeAngle = Coordinate3DAngleOfSlopeBetweenPoints(previousCoordinate, currentCoordinate, false);
slopeAngles[index] = slopeAngle;
}
void processCoordinatesInRange(Range range)
{
for (uint i = range.min;
i <= range.max;
i++)
{
processCoordinatesAtIndex(i);
}
}
void *processCoordinatesInRangePointer(void *threadID)
{
// Cast the pointer to the right type
//
struct Range *range = (struct Range *)threadID;
processCoordinatesInRange(*range);
return NULL;
}
UPDATE:
Здесь являются моими глобальными переменными, которые, только для простоты - не имеют выхода!
std::vector<Coordinate3D> terrain;
std::vector<double> euclideanDistances;
std::vector<double> slopeAngles;
std::vector<Range> rangesProcessed;
std::vector<pthread_t> threadIDs;
В каком направлении вы используете потоки для ускорения работы программы? Подробности имеют значение. Нерестовые потоки имеют накладные расходы. – juanchopanza
У меня есть десять потоков, каждый поток принимает ряд данных из массива координат. Затем выполняет вычисления по этим значениям. i.e thread0 принимает индексы 0-29,999. thread1 принимает индексы 30,000-59,999 и т. д. –
@AdamCarter Фактически, вводя многопоточность в неправильном направлении, он может фактически замедлить работу вашей программы. Трудно сказать. –