Синхронизировать 2 Posix темы - PullRequest
0 голосов
/ 05 марта 2011

У меня есть 2 потока, и оба они удаляют память в конце, оба подключены.Моя проблема в том, что, возможно, может случиться так, что поток начнется и закончится до того, как начнется другой, и поэтому он удалит память, вложенную другим потоком.Как я могу синхронизировать их так, чтобы это не могло произойти.
В качестве дизайна мои потоки выглядят так:

void* thread1(void* arg)   
{
   lock(&mutex);
   counter++;
   unlock(&mutex);

   // more code here

   lock(&mutex);
   counter--;
   if(counter == 0)
   {  
      delete a;
      delete b;
    }
    unlock(&mutex);
}

Другой поток выглядит так же, но это не отменяет остановку потока 1закончить до начала резьбы 2.
Спасибо.

Ответы [ 2 ]

3 голосов
/ 05 марта 2011

Не могли бы вы просто сделать:

void *thread1(void* arg)
{
   // your code

   lock(&mutex);
   counter++;
   if (counter == 2) {
      // whatever
   }
   unlock(&mutex);
}

при условии, что счетчик инициализирован равным 0, прежде чем любой поток, конечно, запустится.

2 голосов
/ 05 марта 2011

Хорошее использование мьютекса здесь, кстати.

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

т.е. измените его на "if (counter == 0 && началось == 2)".

Поскольку вы защищаете счетчик и запускаете доступ с мьютексом, если 1 и 2 запускаются до того, как завершится, первый из них завершится, увидит запущенный = 2 и счетчик = 1. Другой увидит запущенный = 2 и счетчик = 0 и удали ресурсы.

Если поток завершается до того, как запускается другой, он увидит запущенный = 1 и счетчик = 0. Затем другой поток увидит запущенный = 2 и счетчик = 0 и очистится.

...