线程和进程之间的文件锁定

时间:2014-10-08 21:17:19

标签: c windows multithreading unix locking

我有一个程序可以生成多个进程或线程,每个进程或线程在文件上写一行,但显然我不希望该行混淆,所以我需要对文件的独占访问权。 / p>

更具体地说,在第一种情况下,我有一个进程F产生几个子进程(C1,C2,C3,C4,...),我想阻止从F,C2,C3,C4访问, ......当C1写作时。

在第二种情况下,我有相同的进程F产生几个线程(T1,T2,T3,T4,...),并且,我想再次阻止来自F,T2,T3,T4的访问。 ..当T1写作时。

我猜测像flock()这样的函数会处理第一部分,但是线程情况呢?那么Windows平台呢?

2 个答案:

答案 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);
}