C++, как обмениваться данными между процессами или потоками

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

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

Я пробовал с буст делать:

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 ответа

Решение

Если вы можете использовать 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
}

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

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

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

pthread_mutex_lock(&lock);
//access the data
pthread_mutex_unlock(&lock);

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

http://drdobbs.com/cpp/184403766

Другие вопросы по тегам