Допустим, что существует 4 потребительских потока, которые непрерывно работают в цикле
function consumerLoop(threadIndex)
{
int myArray[100];
main loop {
..process data..
myArray[myIndex] += newValue
}
}
У меня есть другой поток монитора, который выполняет другие фоновые задачи. Мне нужно получить доступ к myArray
для каждого из этих потоков из потока монитора.
Предположим, что циклы будут выполняться вечно (так что будут существовать локальные переменные), и единственной операцией, требуемой от потока монитора, является чтение содержимого массива всех потоков.
Один из вариантов - изменить myArray
на глобальный массив массивов. Но я предполагаю, что это приведет к замедлению контуров потребителей.
Каковы неблагоприятные последствия объявления глобального массива указателей int *p[4];
и присваивая каждому элементу адрес локальной переменной, добавляя строку в p[threadIndex] = myArray
например p[threadIndex] = myArray
и доступ к p из потока монитора?
Примечание. Я запускаю его в Linux-системе, а язык - C++. Меня не интересует синхронизация/достоверность содержимого массива, когда я получаю доступ к нему из потока монитора. Давайте избегаем обсуждения блокировки
Если вы действительно заинтересованы в разнице в производительности, вам нужно измерить. Я бы предположил, что почти нет различий.
Оба подхода правильны, если поток монитора не получает локальные переменные стека, которые недействительны, поскольку возвращаемая функция.
Вы не можете получить доступ к myArray из другого потока, потому что это локальная переменная. Вы можете сделать 1) Использовать переменную glibal или 2) Malloca и передать адрес ко всем потокам. Пожалуйста, предохраняйте критическую секцию, когда все потоки спешат использовать общую память.