Следующее объясняет, как сделать это в C#, но то же самое понятие относится к любому языку программирования, который поддерживал бы шаблон "одиночка"
http://www.yoda.arachsys.com/csharp/singleton.html
, Что необходимо решить, хотите ли Вы ленивую инициализацию или нет. Ленивая инициализация означает, что объект, содержавший в одиночном элементе, создается на первом вызове к ней исключая:
MySingleton::getInstance()->doWork();
, если тот вызов не выполняется до позже, существует опасность состояния состязания между потоками, как объяснено в статье. Однако, если бы Вы помещаете
MySingleton::getInstance()->initSingleton();
в самом начале Вашего кода, где Вы предполагаете, что это было бы ориентировано на многопотоковое исполнение, тогда Вы больше не ленивая инициализация, Вы еще потребуете "немного" вычислительная мощность, когда Ваше приложение запустится. Однако это решит много головных болей об условиях состязания, если Вы сделаете так.
GIL все еще присутствует в CPython 3.1; проекты Unladen Swallow нацелены (среди многих других улучшений производительности) на то, чтобы в конечном итоге удалить его, но он все еще далек от поставленных целей, и сначала работает над 2.6 с намерением в конечном итоге портировать на 3.x что угодно x будет актуальным к тому моменту, когда версия 2.y будет считаться завершенной. На данный момент многопроцессорность (вместо потоковой передачи) остается предпочтительным способом использования нескольких ядер в CPython (IronPython и Jython тоже подходят, но в настоящее время они не поддерживают Python 3 и не упрощают интеграцию с C ++; - ).
GIL не повлияет на ваш код, который не использует объекты Python. В Numpy мы выпускаем GIL для вычислительного кода (вызовы линейной алгебры и т. Д.), А базовый код может свободно использовать многопоточность (фактически, это обычно сторонние библиотеки, которые ничего не знают о python)
GIL - это хорошо.
Просто создайте ваше приложение C ++ выпускает GIL, пока выполняет свою многопоточную работу. Код Python будет продолжать работать в других потоках без изменений. Получите GIL только тогда, когда вам нужно прикасаться к объектам Python.
Думаю, GIL будет всегда. Причина в производительности. Обеспечение потоковообезопасности всего низкоуровневого доступа - означает, что размещение мьютекса вокруг каждой операции хеширования и т. Д. - это сложно. Помните, что простой оператор вроде
self.foo(self.bar, 3, val)
может уже иметь по крайней мере 3 (если val является глобальным) поиском по хеш-таблице на данный момент и, возможно, даже больше, если кеш метода не горячий (в зависимости от глубины наследования класса)
Это дорого - вот почему Java отказалась от этой идеи и представила хэш-таблицы, которые не используют вызов монитора, чтобы избавиться от своего товарного знака «Java Is Slow»
Значительные изменения произойдут в GIL для Python 3.2. Посмотрите на Что нового для Python 3.2 и нить, которая инициировала его в списке рассылки .
В то время как изменения не означают конец Гила, они геральд потенциально огромные успехи.
были сделаны усилия за последние 15 лет, чтобы удалить Гил из CPYthon, но в обозримом будущем, оно здесь, чтобы остаться.