2013-03-15 4 views
1

Есть ли способ отметить все объекты __gshared с DMD? Я работаю над движком игры, где практически все должно делиться между потоками, а спам __gshared или shared везде не режет.D как пометить все __gshared?

Для всех, кто хочет, чтобы я этого не делал: критические разделы будут минимальными и сводятся к проверке, если для перечисления установлено значение «Загружено» или нет (конечно, мьютекс). Так что параллелизм мне ничего не принесет.

+4

'__gshared:' до первой декларации не работает? –

+0

У меня слишком много переменных, которые должны быть разделены, я не хочу видеть '__gshared' всюду. – weltensturm

+2

Обратите внимание на двоеточие. Любой атрибут/атрибут может применяться с помощью синтаксиса «attr:» и «attr {}», чем применяется к объявлениям _all_ в области/после двоеточия. –

ответ

5

вы можете поместить все переменные в блоке, и заявляют, что общий

__gshared{ 
    SharedClass instance; 
    //... 
} 

также отметить, что все поля в общем класса или структуры являются общими

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

+0

Это не так просто свести к минимуму, когда нужно загружать почти все ресурсы в другой поток. В любом случае, спасибо, и жаль, что вы не заметили толстой кишки в своем первом ответе. – weltensturm

+0

Другой способ заключается в том, чтобы отбрасывать и делить при общении между потоками –

-1

__gshared сообщает сборщику мусора, что ресурс может использоваться в рамках внешнего кода, поэтому вам потребуется вручную выделить/удалить его (и поэтому вы можете получить доступ к тому же самому ресо urce в любом потоке), с другой стороны, для фактического совместного использования нескольких потоков.

, хотя я могу ошибаться в некоторых деталях, реальная идея заключается в том, что

+1

__gshared не прерывает выделение ресурсов или сборщик мусора. Он просто переносит переменную обратно в глобальное хранилище. – weltensturm