Совместное использование одного буфера - потокобезопасен - PullRequest
0 голосов
/ 10 января 2012

Я не сильно увлекаюсь планированием потоков, у меня 4-5 потоков, и каждый из них будет добавлять данные в один и тот же буфер в произвольное время.Как я могу запланировать потоки, чтобы не было двух или более потоков для одновременного доступа к буферу?Я пишу код на языке C в среде Windows.

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 10 января 2012
pthread_mutex_t         mutex = PTHREAD_MUTEX_INITIALIZER;
int                     sharedData=0;

void *func(void *parm)
{
   int   rc;
   printf("Thread Entered\n");
   pthread_mutex_lock(&mutex);

   /********** Critical Section *******************/
   printf("Start critical section, holding lock\n");
   ++sharedData; 
   printf("End critical section, release lock\n");

   /********** Critical Section *******************/
   pthread_mutex_unlock(&mutex);


}

В приведенном выше примере показано, что вы ищете, используя библиотеку pthreads. Получите мьютекс с помощью pthread_mutex_lock и освободите его с помощью pthread_mutex_unlock. Все потоки, которые запрашивают одну и ту же блокировку, будут заблокированы, пока мьютекс не будет освобожден. Это гарантирует, что только один поток имеет доступ к вашим общим данным.

1 голос
/ 10 января 2012

Общий буфер должен быть защищен от одновременного чтения / записи различными потоками.Объект синхронизации должен использоваться, чтобы предотвратить это.Каждый раз, когда поток хочет читать или записывать в общий буфер, он получает блокировку, выполняет свои операции с общим буфером и снимает блокировку, когда он больше не требует буфера.

Примером объекта синхронизации может быть CriticalSection :

static CRITICAL_SECTION shared_buffer_lock;
static char shared_buffer[10];

int main()
{
    InitializeCriticalSection(&shared_buffer_lock);

    /* Start threads */
    ...

    /* Wait for threads */
    ...

    DeleteCriticalSection(&shared_buffer_lock);

    return 0;
}

/* In thread.. */

/* Obtain sole access to 'shared_buffer' */
EnterCriticalSection(&shared_buffer_lock);

/* Use 'shared_buffer' ... */

/* Release sole access of 'shared_buffer' */
LeaveCriticalSection(&shared_buffer_lock);
0 голосов
/ 10 января 2012

Вам необходимо реализовать монопольный доступ к ресурсам (буферу). В Windows я бы использовал для этого мьютексы (см. CreateMutex и WaitForSingleObject / WaitForMultipleObjects в Windows API).

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