Использование указателей на локальные переменные в многопоточной программе на C ++

0

Допустим, что существует 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++. Меня не интересует синхронизация/достоверность содержимого массива, когда я получаю доступ к нему из потока монитора. Давайте избегаем обсуждения блокировки

  • 1
    почему бы вам не выделить MyArray для каждого потока потребителя в основном потоке и передать адрес в поток потребителя вместе с мьютексом, чтобы избежать проблем с синхронизацией?
  • 0
    Вы не сказали нам, на какой ОС и какой системе потоков вы работаете. Не все модели потоков допускают доступ одного потока к локальным переменным другого. Например, для потоков C11 эта функция определяется реализацией, она может быть там или нет.
Теги:
multithreading

2 ответа

1
Лучший ответ

Если вы действительно заинтересованы в разнице в производительности, вам нужно измерить. Я бы предположил, что почти нет различий.

Оба подхода правильны, если поток монитора не получает локальные переменные стека, которые недействительны, поскольку возвращаемая функция.

-1

Вы не можете получить доступ к myArray из другого потока, потому что это локальная переменная. Вы можете сделать 1) Использовать переменную glibal или 2) Malloca и передать адрес ко всем потокам. Пожалуйста, предохраняйте критическую секцию, когда все потоки спешат использовать общую память.

  • 0
    я не обращаюсь напрямую. Я храню адрес в глобальном указателе и и доступ к нему.
  • 0
    вы используете глобальную переменную, поэтому вы должны использовать мьютекс или семафор, чтобы защитить эту переменную от одновременного доступа потоков.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню