C ++, как обмениваться данными между процессами или потоками - PullRequest
5 голосов
/ 29 февраля 2012

У меня есть программа, которая выполняет две разные операции, и я хотел бы обмениваться переменными между ними.

В настоящее время я использую потоки вместо процессов ветвления, но у меня проблемы с разделениемпеременные, даже если я объявил их как volatile.

Я попытался с boost делать:

boost::thread collisions_thread2(boost::bind(function_thread2);

, объявив общие переменные как volatile, но кажется, что функция function_thread2 () не способнаувидеть изменения в общих переменных.

Что я хотел бы сделать, это что-то вроде:

thread1:

while(true){
//..do somet stuff
check variable1
}

thread2:

while(true){
do some other stuff
check and write on variable1
}

Можете ли вы предложить мне учебное пособие или метод для простого обмена переменными между потоками?Может быть, библиотека повышения может быть полезна в этом случае?Как вы думаете, лучше использовать fork ()?

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

Ответы [ 3 ]

2 голосов
/ 29 февраля 2012

Если вы можете использовать boost, вы можете использовать boost::mutex.

// mtx should be shared for all of threads.
boost::mutex mtx;

// code below for each thread
{
  boost::mutex::scoped_lock lk(mtx);
  // do something
}
2 голосов
/ 29 февраля 2012

Если вы используете потоковые библиотеки posix (которые я рекомендую), используйте pthread_mutex_t.

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

Затем, в каждом потоке, когда вы хотите синхронизировать доступ к данным:

pthread_mutex_lock(&lock);
//access the data
pthread_mutex_unlock(&lock);
1 голос
/ 29 февраля 2012

любой вид блокировки или разблокировки мьютекса будет работать. Что касается вашего вопроса о volatile, это ключевое слово - хорошая практика, особенно в многопоточных программах, таких как ваша. Но это не влияет на то, как вы блокируете и разблокируете. volatile просто говорит компилятору не оптимизировать переменную, например, для положив его в реестр. Вот очень хорошее объяснение:

http://drdobbs.com/cpp/184403766

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