Странный дизайн core.sync.условия в D - PullRequest
0 голосов
/ 12 сентября 2018

В языке программирования D класс Mutex имеет общие и не общие версии своих методов.Это логично - мьютекс распределяется между потоками.Но класс Condition не имеет общих методов вообще.Зачем?Может быть, я что-то пропустил, но для меня это очень странно, потому что такой код не работает:

class Foo {
    private Mutex mtx;
    private Condition cnd;

    shared this() {
        mtx = new Mutex(this); // error: no constructor Mutex(shared Object)
        cnd = new Condition(mtx); // error: no constructor Condition(shared Mutex)
    }
}

Пожалуйста, просветите меня)

1 Ответ

0 голосов
/ 15 сентября 2018

shared такой странный зверь, в основном Mutex имеет только конструкторы, которые принимают общие объекты, которые имеют Mutex, что не является Foo.

Condition не имеет конструктора, которыйзанимает shared(Mutex).

В принципе, вы можете обойти это с помощью этого:

class Foo {
    private Mutex mtx;
    private Condition cnd;

    shared this() {
        mtx = cast(shared)new Mutex(cast() this);
        cnd = cast(shared)new Condition(cast() mtx);
    }
}

Если конструктор shared похож на this() shared, то он на самом деле не применяется квсе, что ему передано, и в основном это только для его тела AFAIK.

Однако, чтобы уточнить код выше.

cast() отбросит любые атрибуты, которые применяются к типу ex.shared, что позволит вам передать его конструкторам.

Поскольку конструктор Foo является общим, нам нужно привести Mutex и Condition обратно к shared, иначе мы не сможем назначитьих к mtx и cnd, которые shared из-за конструктора.

...