Вопрос: Возможно ли гарантировать выполнение кода только в одном потоке за раз в многопоточной программе? (Или то, что приближает это)Выполнение серийного кода в многопоточной программе в C++
В частности: У меня есть контроллер M (который является резьба) и резьба A, B, C. Я хотел M, чтобы иметь возможность решила, кто должен иметь возможность работать. Когда нить закончила (окончательно или временно), управление переходит обратно на М.
Почему: В идеале я хочу, чтобы A, B и C выполняли свой код в своем потоке, а другие не работали. Это позволит каждому потоку сохранять указатель и стек инструкций, пока они останавливаются, начиная с того места, где они остановились, когда контроллер возвращает их обратно.
Что я сейчас делаю: Я написал код, который действительно может это сделать, но мне это не нравится.
В псевдо-C:
//Controller M
//do some stuff
UnlockMutex(mutex);
do{}while(lockval==0);
LockMutex(mutex);
//continue with other stuff
//Thread A
//The controller currently has the mutex - will release it at UnlockMutex
LockMutex(mutex);
lockval=1;
//do stuff
UnlockMutex(mutex);
Причина
do{}while(lockval==0);
требуется в том, что, когда мьютекс разблокируется, А и М будет продолжаться. Этот хак гарантирует, что A не разблокирует мьютекс, прежде чем M сможет снова заблокировать его, чтобы A снова затормозил замок и снова запустил (он должен запускаться только один раз).
До-пока, похоже, перебор, но выполняет эту работу. Так что мой вопрос: есть лучший способ?
Почему вы не хотите, чтобы потоки A, B и C работали одновременно? В чем проблема, которую вы пытаетесь решить? Существует почти наверняка лучший способ решить проблему, но вы должны сказать нам, что проблема * *. –
Эта часть меня смущает: «Это позволит каждому потоку сохранять указатель и стек инструкций при паузе». Это не цель мьютексов.Операционная система (предполагающая модель превентивного потока) поддерживает стек каждого потока и регистрирует его, поскольку он дает им процессорное время. – veefu
@veefu - OP хочет «зеленые нити», волокна AKA, (я думаю). A, B и C все получают свой собственный стек, но только один может фактически запускаться за раз, потому что есть только один поток ядра. –