std::mutex

Teil 3 von 5 der Serie STL Rezepte Sammlung

STL Rezepte Sammlung

std::weak_ptr<>

std::copy_if<>

std::mutex

std::mem_fun

std::chrono::high_resolution_clock

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)

STL Rezepte Sammlung

std::copy_if<> std::mem_fun