我有一个程序可以生成多个进程或线程,每个进程或线程在文件上写一行,但显然我不希望该行混淆,所以我需要对文件的独占访问权。 / p>
更具体地说,在第一种情况下,我有一个进程F产生几个子进程(C1,C2,C3,C4,...),我想阻止从F,C2,C3,C4访问, ......当C1写作时。
在第二种情况下,我有相同的进程F产生几个线程(T1,T2,T3,T4,...),并且,我想再次阻止来自F,T2,T3,T4的访问。 ..当T1写作时。
我猜测像flock()这样的函数会处理第一部分,但是线程情况呢?那么Windows平台呢?
答案 0 :(得分:0)
您可以使用任何所需的锁定机制。在线程之间,互斥是最简单的。对该文件的访问受互斥锁保护,因此没有两个线程可以同时尝试写入该文件。
对于进程,您可以使用进程共享的互斥锁。在Windows上,您可以使用named mutex。
答案 1 :(得分:0)
在线程中,您可以使用mutex
来执行此操作。
在POSIX中,我们有pthread_mutex_t
解决方案:Full example
#include<pthread.h>
pthread_t tid[2];
pthread_mutex_t lock;
void* f(void *arg)
{
pthread_mutex_lock(&lock);
...
pthread_mutex_unlock(&lock);
}
void main(void)
{
pthread_mutex_init(&lock, NULL)
pthread_create(tid[0],..., f, ...);
pthread_create(tid[1],..., f, ...);
pthread_join(tid[0],...);
pthread_join(tid[1],...);
pthread_mutex_destroy(&lock);
}
然后在Windows线程中,我们还有互斥解决方案:Full example
#include <windows.h>
int numThreads = 2;
HANDLE threadHandles[2];
HANDLE mutex = NULL;
void* f(void *arg)
{
WaitForSingleObject(mutex, INFINITE);
...
ReleaseMutex(mutex);
}
void main(void)
{
mutex = CreateMutex(NULL, FALSE, NULL);
threadHandles[0] = CreateThread(..., f, ...);
threadHandles[1] = CreateThread(..., f, ...);
WaitForMultipleObjects(numThreads, threadHandles, TRUE, INFINITE);
CloseHandle(threadHandles);
}