2014-02-18 2 views
0

Я придумал этот вопрос, на котором было предложено написать код на C++. Итак, мне нужно использовать примитивы синхронизации C++.многопоточность с вызовом той же функции

В: Создайте метод (например, foo), который принимает целое число в качестве аргумента и печатает на консоли. Доступ к этому методу осуществляется несколькими потоками. Если два или более потока вызовут метод с одинаковым значением, тогда только один поток должен позволить печатать значение, которое должны ждать другие потоки. Если значения отличаются друг от друга, все потоки должны позволять печатать значение.

Мое предложение использует глобальную хэш-таблицу, позволяющую говорить, unordered_map (i, семафор). Итак, когда вызывается foo (i), foo проверяет хеш-таблицу. Если i не находится в хэш-таблице, мы добавляем map [i] = семафор (0). Когда я печатаю, map [i] .release() вызывается, чтобы разрешить другим ожидающим потокам с вводом i продолжать свою операцию печати. С другой стороны, если i уже находится в хеше, это означает, что работает другой поток с тем же входом, поэтому он должен ждать через map [i] .aquire().

Надеюсь, вы могли бы помочь мне найти лучшее решение или исправленную версию этого предложения.

+1

Что случилось с вашим решением? – nosid

+0

@nosid Я считаю, что использование глобальной хэш-таблицы не является надежным подходом, и поэтому для этого должно быть лучшее решение. – Nazgol

+0

Является ли консольный выход уже синхронизированным? Если нет, вам придется тоже это обработать. Возвращаясь к исходному вопросу, метод должен только отслеживать самый последний вывод значения, а другие потоки не заставили себя ждать (за исключением мьютекса или семафора при доступе/обновлении самого последнего значения), их выходные запросы просто игнорируются, если соответствие с последним значением выводится. – rcgldr

ответ

0

Пример Использование функций Windows и статический глобальный мьютекс.

static HANDLE hMutex; // initialized elsewhere 
// ... 

void DisplayInt(int value) 
{ 
    WaitForSingleObject(hMutex); 
    // ... check value and display message 
    ReleaseMutex(hMutex); 
} 
+0

Более сложным вариантом будет создание еще одного потока, который отображает значения, переданные ему через некоторую форму обмена сообщениями inter thread. Опять же, это позволит избежать отображения значения, которое совпадает с предыдущим отображаемым значением. – rcgldr

Смежные вопросы