C ++ Многопоточные функции с инклюзивным и эксклюзивным в Linux и Windows - PullRequest
1 голос
/ 23 июня 2011

Linux

У меня есть две функции: functionA и functionB

Эти две функции могут запускаться многопоточно, что:

  1. За один раз можно запустить не более одного functionA
  2. Может быть много functionB (s) может быть запущено одновременно
  3. functionA и functionB являются исключительными, т. Е. Если оправдано functionA тогда functionB должен ждать, пока не закончится functionA, и если есть какой-либо экземпляр functionB выполняется, functionA должен дождаться, пока все экземпляры из functionB не завершатся.

Не могли бы вы показать мне, как реализовать это с помощью pthread в Linux? Я пробовал много способов, но это кажется недостаточно ясным.

Windows

Как мне добиться того же в Windows, используя C ++?

Ответы [ 3 ]

2 голосов
/ 23 июня 2011

Вы можете использовать boost для создания блокировки чтения-записи:

#include <boost/thread/locks.hpp>

typedef boost::shared_mutex Lock;
typedef boost::unique_lock< boost::shared_mutex > WrtieLock;
typedef boost::shared_lock< boost::shared_mutex >  ReadLock;

Lock myLock;


void ReadFunction()
{
    ReadLock r_lock(myLock);
    //Do reader stuff
}

void WriteFunction()
{
     WriteLock w_lock(myLock);
     //Do writer stuff
}
2 голосов
/ 23 июня 2011

Похоже на блокировку чтения / записи . Эта статья в Википедии содержит ссылки на ряд реализаций.

1 голос
/ 23 июня 2011

Для них обоих вы захотите взглянуть на Boost.Thread (который будет доступен как std :: thread в большинстве основных C ++-совместимых стандартных библиотек)Это позволит вам выполнить это как в Linux, так и в Windows.

Что вы ищете, так это мьютекс.Мьютекс может быть заблокирован только одним потоком, и пока этот поток не разблокирует мьютекс, он является единственным, которому разрешено выполнять.См. Главу о синхронизации в документации Boost.Thread .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...