Приветствую, не холивара ради, а действительно интересно. Последнее время столкнулся с несколькими цпп либами, авторы которых не удосужились задокументировать как там ведут себя их поделки в многопотоке (thread safe ли api какой-то либы?). Приходится лезть в исходники и разбираться, открывать issue, писать в чаты и тп. Ну в общем больно это всё. Тут я вспоминаю, что растаманы козыряют тем, что у них там в расте нет data race.
Ну думаю - ок, может раст не так уж и плох, если избавит меня от боли - копаться в чьих-то там исходниках, автор которых забил на должные доки. Ну thread safe внутри моего модуля-кода меня интересует мало - я его знаю и понимаю + санитары + знаю как тестить, а вот что происходит в других либах и как с ними взаимодействывать - вот это действительно интересно. Давайте пример:
void library_function(void(*)(shared_ptr<int> i));
std::mutex s_mtx;
shred_ptr<Some_object> s;
void my_callback(shared_ptr<Some_object> i) {
lock_guard l(s_mtx);
s = i;
}
void my_thread() {
while (true) {
this_thread::sleep_for(1s);
lock_guard l(s_mtx);
if (s) {...}
}
}
int main() {
init_library(my_callback);
thread t(my_thread);
...
t.join();
deinit_library();
}
Есть некая внешняя либа, мы её инициализируем и передаём ей колбэки, которые она дергает и как-то взаимодействует с нашим кодом. Либа внутри имеет свои потоки и в них исполняется (теоретически может).
Вопрос - не имея в доках инфы по поводы thread safe данной либы и её объектов, может ли раст дать какие-то гарантии в компал тайме, что если скомпилилось, то всё гуд? Some_object представляет из себя что-то вроде:
class Some_object {
public:
do_this();
do_that();
...
};
PS: не надо цепляться к тому, что раз передали shared_ptr - то объект должен быть thread safe, это вообще не факт, либа даёт объект - из глубин своего ливера в том виде, в котором автор счел нужным, никаких гарантий их этого не возникает












