//Czy w C++ można napisać ekwiwalent Rust'owego mutex'a? Jeśli tak napisz w jaki sposób (może być kod/pseudokod/opis słowny), jeśli nie napisz dlaczego i podaj przykład niepoprawnego działania.

// Odpowiedź: najprawdopodobniej nie da się tego zrobić - nawet jeśli opakujemy dane w jakąś klasę i odp. przeciążymy operator-> to i tak w niektórych przypadkach jest możliwość obejścia mutexa, np. przez zwrócenie z funkcji iteratora do typu opakowanego w mutex. C++ nie ma mechanizmu sprawdzania lifetimeów takiego jak borrow checker i w związku z tym nie jest w stanie zagwarantować poprawnej enkapsulacji dowolnego typu. Poniżej przykład z boost::synchronised_value (które jest próbą implementacji takiego mutexa w C++) :

#include <boost/thread/synchronized_value.hpp>
#include <string>
#include <iostream>

auto foo(boost::synchronized_value<std::string>& path) {
  boost::strict_lock_ptr<std::string> u = path.synchronize();

  if (u->empty() || (*u->rbegin() != '/')) {
    *u += "/my_path";
  }
  std::cout << *u << std::endl;
  return u->begin();
}

int main () {
    boost::synchronized_value<std::string> my_string;
    auto beg = foo(my_string);
    for (int i = 0; i < 8; i++) {
        std::cout << *beg << std::endl;
        ++beg;
    }
    return 0;
}
