Прочитано posix threads tutorial. Тогда вы поймете, почему на практике так важно использовать примитивы синхронизации (по крайней мере, чтобы получить понятное поведение из вашей программы).
Любые данные могут делиться между потоками, потому что все они имеют общий общий код address space. Однако вы действительно хотите синхронизировать такой общий доступ (потому что вы не можете знать, без явной синхронизации, когда один поток видит изменения, сделанные другим потоком, читайте о cache coherence). Обычный способ - использовать для этого mutexes.
Чтобы объяснить немного, объявить глобальный семафор с общими глобальными данными:
pthread_mutex_t glob_mtx = PTHREAD_MUTEX_INITIALIZER;
static struct globaldata_st glob_data;
Затем, чтобы получить доступ к некоторым данным, например, сделать
int sharednumber;
pthread_mutex_lock(&glob_mtx);
sharednumber = glob_data.number;
pthread_mutex_unlock(&glob_mtx);
И атомарно обновление, данные, по его приращением:
int sharednumber;
pthread_mutex_lock(&glob_mtx);
sharednumber = glob_data.number++;
pthread_mutex_unlock(&glob_mtx);
вы так же сериализации обновление или доступ к общей очереди, связанной список, и т.д ....
Не стесняйтесь использовать мьютексы, это quite fast. Всегда Сопряжение pthread_mutex_lock
с pthread_mutex_unlock
....
Помните, что ошибки синхронизации очень трудно охотиться, потому что они не воспроизводимы: они heisenbugs.
С GCC 4.8 на Linux/x86-64 вы можете использовать нить дезинфицирующее с gcc -Wall -fsanitize=thread -g
, чтобы облегчить отладку.
Как насчет двух банок со строкой между ними? ;-) –
Кстати, вы, вероятно, будете использовать inter- * thread * синхронизацию, а не межпрограммную * связь! Поскольку потоки разделяют одно общее адресное пространство, связь является «бесплатной» ... –