Общие и __gshared ключевые слова в D

Когда не используется в контексте static (то есть когда ключевое слово static отсутствует и вы не находитесь в глобальной области действия), что делают ключевые слова shared и __gshared?

Примеры:

struct Temp
{
       shared int i;
    __gshared int j;
}

person user541686    schedule 29.01.2011    source источник


Ответы (2)


Общий тип int имеет тип shared(int), который не делает ничего, кроме присвоения ему этого типа. __gshared int не работает - DMD любит игнорировать атрибуты отсутствия операций.

person Bernard    schedule 29.01.2011
comment
__gshared не бесполезен. Подразумевается статика. - person dsimcha; 30.01.2011
comment
Кроме того: в то время как shared int ведет себя только как квалификатор типа (например, как const) в текущей реализации dmd для локальных переменных, правильно реализованный shared - как я это понимаю - должен иметь семантику чтения-получения и записи-освобождения (т.е. использовать ограничивает память на многих архитектурах и позволяет избежать определенных оптимизаций компилятора, см. также digitalmars.com/d /2.0/faq.html#shared_memory_barriers). Иногда это может быть актуально даже для локальных переменных, например, в случае закрытия, выполняемого в других потоках (или в редком случае доступа к стеку между потоками). - person stephan; 30.01.2011

D2 по умолчанию использует локальное хранилище потоков, а C, C++ и D1 — глобальное хранилище.

Одно из отличий состоит в том, что глобальная переменная в D видна другим потокам, а TLS — нет.

Это может показаться не таким уж большим, но попробуйте подключиться к библиотеке C, не осознавая этого. (неизменяемый также является глобальным)

IME __gshared в значительной степени существует только для того, чтобы сделать что-то глобальным, когда обычно это не так.

могут быть и другие применения для него, но я не видел ни одного.

Примером может служить глобальная переменная в заголовке C. Если вы попытаетесь взаимодействовать с ним, вам понадобится неизменяемый или __gshared. Есть, конечно, и другие способы, но этот, пожалуй, самый простой.

person 1100110    schedule 11.04.2012