Повысить порядок мьютекса - PullRequest
1 голос
/ 17 января 2011

Таким образом, имея простой класс

class mySafeData
{
public:
  mySafeData() : myData(0)
  {
  }

void Set(int i) 
  {
    boost::mutex::scoped_lock lock(myMutex);
    myData = i; // set the data
    ++stateCounter;  // some int to track state chages
    myCondvar.notify_all(); // notify all readers
  }

  void Get( int& i)
  {
    boost::mutex::scoped_lock lock(myMutex);
    // copy the current state
    int cState = stateCounter;
    // waits for a notification and change of state
    while (stateCounter == cState)
      myCondvar.wait( lock );
  }
 private:
   int myData;
   int stateCounter;
   boost::mutex myMutex;
};

и массив потоков в бесконечных циклах, вызывающих каждую функцию

 Get()
 Set()
 Get()
 Get()
 Get()

, они всегда будут вызывать функции в одном и том же порядке и только один раз за круг(Под кружком я подразумеваю, что все потоки наддува будут работать в одном и том же порядке каждый раз, так что каждый поток будет Get () только один раз после одного Set ())?

Ответы [ 3 ]

5 голосов
/ 17 января 2011

Нет.Вы никогда не сможете сделать какие-либо предположения о том, какой порядок будут обслуживаться потоками.Это не имеет ничего общего с повышением, это основы мультипрограммирования.

2 голосов
/ 17 января 2011

Потоки должны получить блокировку в том же порядке, в котором они достигают конструктора scoped_lock (я думаю). Но нет никакой гарантии, что они достигнут этой точки в любом фиксированном порядке!

В общем, не надейтесь на это.

1 голос
/ 17 января 2011

Нет, мьютекс запрещает доступ к переменной одновременно только двум потокам.Это не влияет на порядок планирования потоков или время выполнения, которое для всех намерений и целей можно считать случайным.

...