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 просто говорит компилятору не оптимизировать переменную, например, помещая ее в регистр. Вот очень хорошее объяснение: