определяемая пользователем структура не может быть передана через tid.send

#multithreading #d

#многопоточность #d

Вопрос:

Я создал многопоточный симулятор, который в значительной степени зависит от собственного сообщения, передаваемого между потоками (не говорите мне, что я должен использовать однопоточный, это для моей диссертации по D, и мне нужно заставить это работать)

после очень длительной работы, включающей множество приведений объектов туда и обратно shared . в котором, вероятно, были некоторые уродливые ошибки в условиях гонки. Я решил создать непрозрачный тип, представляющий объект, который может получать сообщения, которые должны быть способны передаваться без всего этого приведения…

не повезло

 struct OpaqueFaseSim{
    Tid tid;
    void send(...){...}
}

void foo(){
Tid tid;
long time;
    OpaqueFaseSim ofs;
    //...
    tid.send(ofs,time);//Error: static assert  "Aliases to mutable thread-local data not allowed."
}
  

почему я могу передавать Tid, но не структуру, содержащую только Tid?

и как я могу это исправить

Комментарии:

1. Как можно догадаться, прочитав сообщение об ошибке: вы могли бы попробовать добавить неизменяемый где-нибудь там.

2. добавление неизменяемого в Tid означает, что я не могу отправлять ему сообщения, что отчасти противоречит цели создания этой структуры (std.concurrency. отправка не принимает неизменяемый Tid)

Ответ №1:

Я думаю, это потому, что у Tid есть поле MessageBox, которое является типом класса.

Вы можете ввести поле tid OpaqueFaseSim как shared или ___gshared, и это будет работать:

 struct OpaqueFaseSim{
    Bar bar;
    shared Tid tid;
    // __gshared Tid tid;
}
  

Комментарии:

1. да, я заглянул в исходные файлы библиотеки вскоре после того, как задал этот вопрос и отправил для него исправление , и в моем проекте я теперь использую общий идентификатор и возвращаю его к не общему при отправке (еще одно странное поведение TBH)