Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 线程和进程之间的文件锁定_C_Windows_Multithreading_Unix_Locking - Fatal编程技术网

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

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平台呢

我有一个生成多个进程或线程的程序,每个进程或线程在文件上写一行,但显然我不想让行混淆,所以我需要独占访问文件

更具体地说,在第一种情况下,我有一个进程F,它生成了几个子进程(C1、C2、C3、C4,…),我想阻止来自F、C2、C3、C4。。。当C1正在写入时

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


我猜像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);
}