2014-10-08 63 views
0

我有一個程序產生多個進程或線程,每個進程或線程在文件上寫入一行,但顯然我不希望該行混在一起,所以我需要獨佔訪問文件。更具體地說,在第一種情況下,我有一個進程F,它產生了幾個子進程(C1,C2,C3,C4,...),並且我想阻止從F,C2,C3,C4的訪問,...當C1正在寫作時。在第二種情況下,我有相同的進程F,它產生了幾個線程(T1,T2,T3,T4,...),並且我想再次阻止從F,T2,T3,T4, ...當T1正在寫作時。線程和進程之間的文件鎖定

我猜flock()函數照顧的第一部分,但線程情況呢?那麼Windows平臺呢?

回答

0

您可以使用任何你想要的鎖定機制。在線程之間,互斥是最簡單的。對文件的訪問受互斥體保護,因此沒有兩個線程可以嘗試同時寫入文件。

對於進程,您可以使用進程共享的互斥鎖。在Windows上,您可以使用named mutex

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