Синхронизировать структуру в C для потоков - PullRequest
1 голос
/ 14 ноября 2010

У меня есть глобальная структура, которую я использую внутри потоков, которую я создаю, используя pthread.h. Есть параллельные потоковые события, обновляющие переменные внутри него. Поэтому мои данные в структуре часто не синхронизированы, как я выяснил с помощью обширной отладки.

В Cafaik нет такого ключевого слова, как "synchonized" (фон Java). Итак, как мне заблокировать структуру данных, чтобы она оставалась действительной?

Моя структура:

struct thread_data 
{
   int nr;
   int time;
};
struct thread_data thread_data_array[MAX_THR];

MAX_THR определяется как 10, например.

Мои данные передаются в новый поток с pthread_create:

pthread_create(&threads[num_threads], NULL, Thread_Fkt, &thread_data_array[num_thread]);

Иногда потоки создаются внутри других потоков. Там нет линейного завершения. Предоставляет ли C синхронизированный набор структур данных?

Спасибо;)

Ответы [ 5 ]

8 голосов
/ 14 ноября 2010

Вам, вероятно, следует изучить pthread mutex:

Мьютекс - это устройство исключения MUTual, которое полезно для защиты общих структур данных от одновременных изменений и реализациикритические секции и мониторы.

4 голосов
/ 14 ноября 2010

Потоки являются частью не самого C, а операционной системы.

"pthread" в pthread_create обозначает потоки POSIX. В POSIX есть несколько утилит для синхронизации между потоками. Это, безусловно, будет зависеть от того, чего именно вы хотите достичь.

pthread_mutex_t
pthread_barrier_t
pthread_cond_t

Первую информацию об этом можно найти, обратившись к страницам руководства по их функциям init, например,

man pthread_mutex_init
2 голосов
/ 15 ноября 2010

Предположительно, ваша num_threads переменная является глобальной и используется всеми потоками. В качестве примера использования мьютексов pthreads вы могли бы защитить эту переменную, объявив связанный мьютекс:

int num_threads = 0;
pthread_mutex_t mtx_num_threads = PTHREAD_MUTEX_INITIALIZER;

Затем, когда вы обращаетесь к переменной, вам нужно заблокировать мьютекс:

pthread_mutex_lock(&mtx_num_threads);
new_thread = num_threads++;
pthread_mutex_unlock(&mtx_num_threads);

pthread_create(&threads[new_thread], NULL, Thread_Fkt, &thread_data_array[new_thread]);
1 голос
/ 15 ноября 2010

Я просто хотел уточнить два других ответа.

В отличие от других языков, в «C» нельзя просто объявить структуру как «защищенную» и иметь абстрактный компилятор / библиотеки / фреймворквся синхронизация для вас.

pthread мьютексы - это путь, но это ручной процесс, в котором вы должны определитькакие разделы кода (в отличие от структур данных ) должны быть защищены, и чтобы включить эту защиту в ваш код.

Это состоит из определения, какие части code коснется этих общих структур данных и поместит код в соответствующих операторов pthread_mutex_lock и pthread_mutex_unlock.

0 голосов
/ 11 января 2011

Мьютексы медленные. Посмотрим, сможете ли вы сойти с рук с помощью атомарных операций.

...