サーバーがソケットでクライアントからリクエストを取得し、クライアントごとにスレッドを作成するコードを以下に記述しました。各クライアント スレッドは、すべてのスレッドに共通のファイルに書き込みます。ファイルはopen
main の開始時に ed されているため、各スレッドで同じ fd が使用されています。このようなシナリオでは、1 つのスレッドがファイルに書き込みを行っているときにファイルをロックしようとしました。スレッドは同じプロセスであるため、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日前にすでに投稿しましたが、コメントはありません.