morgue?
Математика в основном. А что?...
>Ты не понял ... они мешают создавать ОДНОВРЕМЕННО (из разных потоков) более
>одного экземпляра.
>Более того, критические секции в этом макросе есть только в ДЕБАГЕ, а в релизе
>их нет.
>Первый поток захватывает критическую секцию и начинает создавать объект.
>В это время второй поток тоже захватывает критическую секцию и ожидает пока
>первый поток освободит ее.
>Создав объект первый поток освобождает ее и второй поток начинает создавать
>объект.
А всё равно в приложении существуют как минимум по 2 указателя на каждую подсистему )
>Первый поток захватывает критическую секцию и начинает создавать объект.
>В это время второй поток тоже захватывает критическую секцию и ожидает пока
>первый поток освободит ее.
>Создав объект первый поток освобождает ее и второй поток начинает создавать
>объект.
И какой в этом имбический смысл?...
>morgue?
>Математика в основном. А что?...
Это корзина куда автор сбрасывает не нужные исходники.
В движке они нигде не используются.
Даже название в переводе с английского - морг.
>А всё равно в приложении существуют как минимум по 2 указателя на каждую подсистему )
В любом случае использовать нужно лишь синглетон. Второй лишь для инициализации/деинициализации.
И вобще причем здесь два указателя и одновременное/не одновременное создание объектов ?
>И какой в этом имбический смысл?...
Критические секции, мьютексы, семафоры и т.д. и т.п.
Мне показалось, что у тебя плохо с пониманием что это, зачем нужно вобще
и в частности где и как используется в Небуле.
>Критические секции, мьютексы, семафоры и т.д. и т.п.
>Мне показалось, что у тебя плохо с пониманием что это, зачем нужно вобще
>и в частности где и как используется в Небуле...
... и именно поэтому я обратился сюда, что бы люди, знакомые с этим, объяснили мне эту цепочку действий.
>... и именно поэтому я обратился сюда, что бы люди, знакомые с этим, объяснили мне эту цепочку действий.
Я, в общем то, и объясняю.
Хотя лучше всего почитай в инете про многопоточность.
Вот, например, первая попавшаяся ссылка: http://www.codenet.ru/progr/cpp/threads.php
И сразу, вроде, достаточно подробная информация зачем нужны и как использовать.
Intor
Спасибо, хорошая статья.
Кстати, а сколько в Небуле 3-й потоков работает?
student
>Кстати, а сколько в Небуле 3-й потоков работает?
По умолчанию четыре.
Рекомендую скачать и разобраться в программе Process Explorer.
В ней можно наблюдать много полезных вещей про работающие процессы.
Intor
Спасибо.
Ещё вот что хотел бы уточнить.
Зачем определять для каждого класса new/delete?
define DeclareClass(type) \ public: \ void* operator new( size_t size) \ { \ return Memory::Alloc( size); \ }; \ void operator delete( void* p) \ { \ Memory::Free( p); \ }; \
Ведь объект класса всё равно создаётся с помощью n_new:
type* type::Create() \ { \ RefCounted::criticalSection.Enter( ); \ RefCounted::isInCreate = true; \ type* newObject = n_new( type); \ RefCounted::isInCreate = false; \ RefCounted::criticalSection.Leave( ); \ return newObject; \ }\
?
Intor
>student
>>Кстати, а сколько в Небуле 3-й потоков работает?
>По умолчанию четыре.
А какие именно?
student
>Зачем определять для каждого класса new/delete?
>Ведь объект класса всё равно создаётся с помощью n_new
#define n_new(type) new type
Определен в win32memory.h
>>>Кстати, а сколько в Небуле 3-й потоков работает?
>>По умолчанию четыре.
>А какие именно?
1). Основной (инициализация и редеринг).
nviewer3.exe!Direct3D9::D3D9RenderDevice::Present+0x6b
nviewer3.exe!Graphics::GraphicsServer::OnFrame+0x14f
nviewer3.exe!App::ViewerApplication::OnRenderFrame+0x28
nviewer3.exe!App::RenderApplication::Run+0xe2
nviewer3.exe!NebulaMain+0x9a
nviewer3.exe!WinMain+0x2d
2). Подсистема сообщений.
nviewer3.exe!Win32::Win32Event::Wait+0x2d
nviewer3.exe!Threading::SafeQueue<Ptr<Messaging::Message> >::Wait+0x1e
nviewer3.exe!Messaging::AsyncPort::HandlerThread::DoWork+0x76
nviewer3.exe!Win32::Win32Thread::ThreadProc+0x68
3). HTTP сервер.
nviewer3.exe!Win32::Win32Socket::Accept+0x9a
nviewer3.exe!Net::TcpServer::ListenerThread::DoWork+0x10a
nviewer3.exe!Win32::Win32Thread::ThreadProc+0x68
4). Служебный поток Direct Input.
Intor
>student
>>Зачем определять для каждого класса new/delete?
>>Ведь объект класса всё равно создаётся с помощью n_new
>#define n_new(type) new type
>Определен в win32memory.h
Ну так и юзали бы его. Зачем для КАЖДОГО класса определять его снова?
student
>Ну так и юзали бы его. Зачем для КАЖДОГО класса определять его снова?
Не "снова", а один для всех, просто другой, не стандартный.
Причем смотри особенность: если ты где-то там напишешь "... = new ...", то будет использоваться стандартный аллокатор, а не небуловский.
Для небуловского надо написать "... = n_new ...".
Зачем это ?
Для того, чтобы менеджить память только ДВИЖКА небулы.
Т.е. того, что мы понаписали, а не вобще всего кода.
Для этого же не переопределены всякие malloc, free ...
Intor
>Зачем это ?
>Для того, чтобы менеджить память только ДВИЖКА небулы.
>Т.е. того, что мы понаписали, а не вобще всего кода.
>Для этого же не переопределены всякие malloc, free ...
Вот тут не понял немного... (
student
>Вот тут не понял немного... (
К примеру, мы используем несколько сторонних библиотек (sqlite, tinyxml, zlib, ...).
Они для себя выделяют память с помощью, например, malloc, но нам не интересно, что там они понавыделяли для себя ...
Нам интересна лишь та память, что что выделялась в коде самой Небулы, а не сторонних библиотеках.
И поэтому мы переопределяем аллокаторы памяти только для тех объектов, за которыми мы хотим следить.
ммм а никто не подскажет зачем __declspec(thread) в синглтоне ?
Тема в архиве.