В языке с++ перменная, объявленная в инициализаторе цикла for, освобождается при завершения цикла.
Надо сделать класс, в конструкторе которого мутекс запирается, а в деструкторе мутекс отпирается, а так же две операции -- инкремент и проверка на завершение (для организации цикла)
Пример кода:
include <iostream>
class Mutex
{
private:
public:
Mutex() {}
~Mutex() {}
void lock() { std::cerr << "Locked\n"; }
void unlock() { std::cerr << "Unocked\n"; }
};
class Local_Lock {
private:
Mutex & _mutex;
int _i;
public:
Local_Lock(Mutex & mutex) : _mutex(mutex), _i(0) { _mutex.lock(); }
~Local_Lock() { _mutex.unlock(); }
bool test() { return (_i == 0); }
void next() { _i ++; }
};
#define syncronized(mutex) for (Local_Lock __local_lock_var(mutex); __local_lock_var.test(); __local_lock_var.next())
int main()
{
Mutex & m = *(new Mutex);
syncronized(m) {
std::cerr << "In 'syncronized' block\n";
Mutex & m2 = *(new Mutex);
syncronized(m2) {std::cerr << "In 'syncronized' block, 2\n"; }
}
for (Local_Lock ll(m); ll.test() ; ll.next())
{ std::cerr << "In ''for'' block\n"; }
return 0;
}
Программа порождает такой вывод:
Locked
In 'syncronized' block
Locked
In 'syncronized' block, 2
Unocked
Unocked
Locked
In ''for'' block
Unocked