C ++ Threads и простой механизм блокировки? - PullRequest
1 голос
/ 08 сентября 2010

У меня есть программа на C ++, которая запускает несколько потоков для манипулирования одними и теми же данными.Каждый из этих потоков имеет указатель на объект, которым манипулируют, например:

thread1 и thread2 оба имеют указатель на object1
object1-> addSomething (), который может использоваться либо thread1, либо 2и ссылаются на один и тот же объект

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

void method()
{
  waitUntilFree()
  blockForOthers()
  doSomething()
  unblock()
}

Есть ли простой способ сделать это?Я просто хочу заблокировать и ждать, пока он не станет бесплатным.Я не против, что нить, возможно, придется подождать некоторое время.Есть ли простой механизм для этого?Я использую Boost для этих потоков, но я не мог придумать способ сделать это (на первый взгляд) простой блок-и-подождите.

Ответы [ 4 ]

5 голосов
/ 08 сентября 2010

Как отметил Ферруччо, для синхронизации можно использовать Mutex , например Boost.Mutex из той же библиотеки:

class X {
    boost::mutex m_mutex;
public:
    void method() {
        boost::mutex::scoped_lock lock(m_mutex);
        // ... now locked, do stuff
    } // mutex automatically unlocked when scoped_lock is destructed
}; 
2 голосов
/ 08 сентября 2010

Поскольку вы уже используете Boost, вы можете использовать Boost mutex для защиты одновременного доступа нескольких потоков.

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

// create the mutex where it can be accessed by all threads
boost::mutex lock;

// in each thread
lock.lock();
// do something with shared data
lock.unlock();

// for each thread
thread.join(); // wait for thread to finish
1 голос
/ 08 сентября 2010

Использование мьютекс .

Более подробную информацию об этом вы можете найти на http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html#SYNCHRONIZATION

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void *functionC();
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
int  counter = 0;

main()
{
   int rc1, rc2;
   pthread_t thread1, thread2;

   /* Create independent threads each of which will execute functionC */

   if( (rc1=pthread_create( &thread1, NULL, &functionC, NULL)) )
   {
      printf("Thread creation failed: %d\n", rc1);
   }

   if( (rc2=pthread_create( &thread2, NULL, &functionC, NULL)) )
   {
      printf("Thread creation failed: %d\n", rc2);
   }

   /* Wait till threads are complete before main continues. Unless we  */
   /* wait we run the risk of executing an exit which will terminate   */
   /* the process and all threads before the threads have completed.   */

   pthread_join( thread1, NULL);
   pthread_join( thread2, NULL); 

   exit(0);
}

void *functionC()
{
   pthread_mutex_lock( &mutex1 );
   counter++;
   printf("Counter value: %d\n",counter);
   pthread_mutex_unlock( &mutex1 );
}
0 голосов
/ 08 сентября 2010

Вы ищете так называемые мьютексы. Они приходят как часть библиотеки потоков. Взгляните на этого доктора. статья Доббса .

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