#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)