我写了下面的代码,其中服务器从socket上的客户端获取请求并为每个客户端创建一个线程。然后,每个客户端线程都写入一个对所有线程都通用的文件。主要启动时文件已open
,因此每个线程使用相同的fd。在这种情况下,我试图在一个线程写入文件时实现锁定。由于线程具有相同的进程,因此flock
无法简单地锁定文件,因此使用mutex
。
/*Logging function*/
void write_to_file(int op_fd,char *name)
{
flock(op_fd,LOCK_EX);
pthread_mutex_lock(&f_lck);
write(op_fd,name,20);
pthread_mutex_unlock(&f_lck);
flock(op_fd,LOCK_UN);
}
/*Client thread function*/
void *clnt_thread(void * arg)
{
int this_fd=*(int *)arg;
/*str is a continuous memory array of the size of the dat_com struct.This will be filled up initially on receive as a normal array
, but then it'll typecasted to point to struct dat_com object*/
char str[sizeof(dat_com)],str_send[25];
memset(&str,'\0',sizeof(str));
dat_com *incm_dat; // struct to contain the incoming data from client .
while(1)
{
read(this_fd,str,sizeof(str));
/*typecast to struct dat_com so that it is ready to be inserted into linked list or file.*/
incm_dat=(dat_com *)&str;
if(strncmp(str,"quit",4)==0)
break;
/*Call write to file function*/
write_to_file(o_fd,incm_dat->name);
fprintf(stderr,"Client said: %s",incm_dat->name);
/*client wants to close connection?*/
sprintf(str_send,"%s",incm_dat->name);
send(this_fd,str_send,sizeof(incm_dat->name),MSG_NOSIGNAL);
}
close(this_fd);
return 0;
}
目前正如预期的那样。锁定这种方式这是一个好习惯吗?或者还有其他最佳做法吗?如果我必须将这些代码用于生产,那么我需要做出哪些不是标准做法的变更?
我理解这应该在codereview
网站上,所以我已经在3天前发布了它,但没有任何意见。
答案 0 :(得分:0)
在我看来,给每个写作线程直接访问文件描述符并不是一个很好的做法。我认为最好创建一个文件编写器代理来管理和管理对文件的所有写入,并将该代理传递给每个客户端。然后,您可以在客户端线程和文件代理之间设置队列机制(可能在其自己的线程上),从而将客户端对象与写入文件逻辑分离并完全处理并保持更好的封装。