Я реализовал этот метод с уникальной блокировкой и условной переменной. Он добавляет элемент в массив, но только если массив не заполнен. Если он заполнен, он ожидает, когда другие потоки извлекут элемент, и только потом помещает новый.
void Filter::put(Person person)
{
std::unique_lock<std::mutex> guard(lock);
cv.wait(guard, [&] { return !full; });
container[count] = person;
count++;
empty = false;
if (count == 10)
full = true;
cv.notify_all();
}
Моя цель - написать тот же метод с использованием OpenMP. Если я правильно понимаю, #pragma omp critical (name)
должен делать то же самое, что и уникальный замок. Тем не менее, я не уверен, как я должен идти о спинлок.