C 线程和进程之间的文件锁定
我有一个生成多个进程或线程的程序,每个进程或线程在文件上写一行,但显然我不想让行混淆,所以我需要独占访问文件 更具体地说,在第一种情况下,我有一个进程F,它生成了几个子进程(C1、C2、C3、C4,…),我想阻止来自F、C2、C3、C4。。。当C1正在写入时 在第二种情况下,我有相同的进程F,它产生了几个线程(T1、T2、T3、T4,…),并且我想再次阻止来自F、T2、T3、T4。。。当T1正在写入时C 线程和进程之间的文件锁定,c,windows,multithreading,unix,locking,C,Windows,Multithreading,Unix,Locking,我有一个生成多个进程或线程的程序,每个进程或线程在文件上写一行,但显然我不想让行混淆,所以我需要独占访问文件 更具体地说,在第一种情况下,我有一个进程F,它生成了几个子进程(C1、C2、C3、C4,…),我想阻止来自F、C2、C3、C4。。。当C1正在写入时 在第二种情况下,我有相同的进程F,它产生了几个线程(T1、T2、T3、T4,…),并且我想再次阻止来自F、T2、T3、T4。。。当T1正在写入时 我猜像flock()这样的函数会处理第一部分,但是线程的情况又如何呢?那么Windows平台呢
我猜像flock()这样的函数会处理第一部分,但是线程的情况又如何呢?那么Windows平台呢?您可以使用任何想要的锁定机制。在线程之间,互斥是最简单的。对文件的访问受互斥锁保护,因此没有两个线程可以尝试同时写入文件
对于进程,可以使用进程共享互斥体。在Windows上,您可以在线程中使用。,您可以使用
互斥体来执行此操作
在POSIX中,我们有pthread\u mutex\t
解决方案:
#包括
pthread_t tid[2];
pthread_mutex_t lock;
void*f(void*arg)
{
pthread_mutex_lock(&lock);
...
pthread_mutex_unlock(&lock);
}
真空总管(真空)
{
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线程中,我们还有互斥解决方案:
#包括
int numThreads=2;
手柄螺纹手柄[2];
句柄互斥=NULL;
void*f(void*arg)
{
WaitForSingleObject(互斥,无限);
...
释放互斥(mutex);
}
真空总管(真空)
{
mutex=CreateMutex(NULL、FALSE、NULL);
threadHandles[0]=CreateThread(…,f,…);
threadHandles[1]=CreateThread(…,f,…);
WaitForMultipleObjects(numThreads、threadHandles、TRUE、INFINITE);
闭合手柄(螺纹手柄);
}
#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);
}
#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);
}