共享一个缓冲区 - 线程安全

时间:2012-01-09 20:51:46

标签: c windows multithreading thread-safety threadpool

我对调度线程并不多,我有4-5个线程,每个线程都会随机将数据添加到同一个缓冲区。 我如何安排线程,以便没有两个或多个线程同时访问缓冲区? 我在Windows环境下用C编码。

提前致谢。

3 个答案:

答案 0 :(得分:1)

共享缓冲区需要受到不同线程的并发读/写保护。应该使用同步对象来防止这种情况发生。无论何时线程想要读取或写入共享缓冲区,它都会获取锁定,在共享缓冲区上执行其操作,并在没有任何需要缓冲区的情况下释放锁定。

示例同步对象是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);

答案 1 :(得分:1)

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释放它。在释放互斥锁之前,将阻止请求相同锁定的所有线程。这可以保证只有一个线程可以访问您的共享数据。

答案 2 :(得分:0)

您需要实现对ressource(缓冲区)的独占访问。在Windows下我会使用Mutexes(请参阅Windows API中的CreateMutex和WaitForSingleObject / WaitForMultipleObjects)。