STL Rezepte Sammlung
Mit der kompakten Hilfsklasse Autoblocker können kritische Programmteile sehr bequem vor gleichzeitigen Zugriff geschützt werden. Die Idee ist, den kritischen Code in einem eigenen Block, der Critical Section, zu klammern.
Früher hat man das mit pthread_mutex gemacht. Doch da bestand noch die gefahr von Resource-Leaks, denn es war noch eine Initialisierung und die Freigabe nach der Verwendung notwendig. Mit std::mutex wird es nun viel einfacher einen kritischen Block (critical section) abzusichern.
#include <thread>
#include <mutex>
#include <vector>
#include <string.h>
class AutoBlocker
{
private:
std::mutex& cs;
public:
AutoBlocker(std::mutex& _cs) : cs(_cs)
{
cs.lock();
}
~AutoBlocker()
{
cs.unlock();
}
};
std::mutex cs;
int data;
void write(int value)
{
AutoBlocker ab(cs);
data = value;
}
void read()
{
int i;
{
AutoBlocker ab(cs);
i = data;
}
printf("%dn", i);
}
int main ()
{
std::vector<std::thread> threads;
for (int i = 0; i < 10; i++)
{
threads.emplace_back(std::thread(write, i));
}
for (int i = 0; i < 10; i++)
{
threads.emplace_back(std::thread(read));
}
for (auto& th : threads) th.join();
return 0;
}Code-Sprache: PHP (php)