我对调度线程并不多,我有4-5个线程,每个线程都会随机将数据添加到同一个缓冲区。 我如何安排线程,以便没有两个或多个线程同时访问缓冲区? 我在Windows环境下用C编码。
提前致谢。
答案 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)。