很遗憾没有做我自己的研究并在这里问.我的时间略短.
是否可以为单个线程中的两个或多个线程提供两个文件描述符表.两个或多个子线程同时访问同一个文件,因此来自不同线程的同一文件的两个不同打开的偏移量是否是特定于线程的?
谢谢
我正在研究一个多线程系统,根据文件访问权限,可以在不同的线程之间共享文件.如何检查文件是否已被另一个线程打开.提前致谢
我正在开发一个多线程应用程序,其中多个线程可能需要独占访问同一文件。我正在寻找一种序列化这些操作的方法。我打算使用flock、lockf或fcntl锁定。然而,使用这些方法,当第一个线程已经拥有锁时,第二个线程尝试锁定文件似乎将被授予,因为这两个线程位于同一进程中。这是根据flock和fnctl的手册页(我猜在linux中lockf是用fnctl实现的)。也得到了另一个问题的支持。那么,在 Linux 中是否有其他方法可以在线程级而不是进程级锁定文件呢?
我提出的一些我不喜欢的替代方案是:
1) 使用通过 O_CREAT | 打开的锁文件 (xxx.lock) O_EXCL 标志。如果存在争用,则此调用仅在一个线程中成功。这样做的问题是,其他线程必须在调用上旋转,直到它们获得锁定,这意味着我必须 _yield() 或 sleep() ,这让我认为这不是一个很好的选择。
2) 保留所有打开文件的互斥列表。当线程想要打开/关闭文件时,它必须首先锁定列表。打开文件时,它会搜索列表以查看它是否已打开。这听起来特别低效,因为即使文件尚未被拥有,它也需要大量的工作。
还有其他方法可以做到这一点吗?
编辑: 我刚刚在系统的手册页中发现了这段文本,但它不在在线手册页中:
如果进程使用 open(2) (或类似的)来获取同一文件的多个描述符,则这些描述符将由 flock() 独立处理。使用这些文件描述符之一锁定文件的尝试可能会被调用进程已经通过另一个描述符放置的锁拒绝。
我对“可能被拒绝”这个词不满意,我更喜欢“将被拒绝”,但我想是时候测试一下了。
我正在测试是否从其他线程锁定文件描述符会影响主线程。
#include <iostream>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
//#include <share.h>
#include <stdio.h>
#include <pthread.h>
#include <errno.h>
void *print_message_function( void *ptr );
pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
int main (int argc, char * const argv[]) {
pthread_t thread1, thread2;
const char *message1 = "Thread 1";
const char *message2 = "Thread 2";
int iret1, iret2;
iret2 = pthread_create( &thread2, NULL, print_message_function, (void*) message1);
if(iret2)
{
fprintf(stderr,"Error - pthread_create() return code: %d\n",iret2);
fflush(stdout);
exit(EXIT_FAILURE);
}
printf("pthread_create() for thread 2 …Run Code Online (Sandbox Code Playgroud) 我尝试使用python处理文本替换问题。有一个Little-endian UTF-16格式的文件,我想替换此文件中的IP地址。首先,我逐行读取此文件,然后替换目标字符串,最后,我将新字符串写入文件。但是使用多线程操作此文件时,该文件将出现乱码。这是我的代码。
import re
import codecs
import time
import thread
import fcntl
ip = "10.200.0.1"
searchText = r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
def replaceFileText(fileName,searchText,replaceText,encoding):
lines = []
with codecs.open(fileName,"r",encoding) as file:
fcntl.flock(file,fcntl.LOCK_EX)
for line in file:
lines.append(re.sub(searchText,replaceText,line))
fcntl.flock(file,fcntl.LOCK_UN)
with codecs.open(fileName,"w",encoding) as file:
fcntl.flock(file,fcntl.LOCK_EX)
for line in lines:
file.write(line)
fcntl.flock(file,fcntl.LOCK_UN)
def start():
replaceFileText("rdpzhitong.rdp",searchText,ip,"utf-16-le")
thread.exit_thread()
def test(number):
for n in range(number):
thread.start_new_thread(start,())
time.sleep(1)
test(20)
Run Code Online (Sandbox Code Playgroud)
我不明白为什么文件出现乱码,我使用fcntl flock保持读取/写入顺序,问题出在哪里?