gpt4 book ai didi

c - 结构体中的指针问题

转载 作者:行者123 更新时间:2023-11-30 14:26:06 27 4
gpt4 key购买 nike


我可能有 fp 的指针问题,因为我收到 (SIGSEGV) 错误。但我对 C 没有太多经验,所以我看不到它。

我正在尝试做的事情。我为简单的游戏做服务器应用程序,我在新线程中处理客户端。我使用函数pthread_create,它有一个名为handle_client的句柄函数,我需要输入一些参数socketdescritpor(它有效)和filedescriptor来写入日志(可能有问题)。在我的主文件中,我打开日志文件,然后将文件描述符放入我的结构中,我在handle_client函数中获取该结构,在这个函数中我想取回该文件的文件描述符(fp)日志文件,能够写入文件。我使用 fflush(fp) 在每个 fprintf 之后保存数据,我打开文件一次,然后每个客户端应该能够通过这个描述符写入文件,但我可能用指针做了一些不好的事情(我的意思是得到 fp 从结构中进出,我的代码中有一段是在其中执行此操作的。)谢谢帮助。

结构体

 typedef struct
{
int fd;
FILE *fp; //filepointer for logs file
} my_thread_context_t;

主要内容

int main(int argc, char *argv[]) {
FILE * fp;
fp = fopen("Serverlog.log","w");//delete last file
fclose(fp);
fp = fopen("Serverlog.log","a+");
my_thread_context_t ctx;

//bind server
//listen

while(1) {
//accept

ctx.fp = fp;// add file pointer to structure
int check = pthread_create(&thread, NULL,handle_client,&ctx);
//other code
}

hadle_client函数

void * handle_client(void * void_context){
my_thread_context_t * context = (my_thread_context_t *) void_context;

FILE *fp; //pointer na soubor s logy
fp = context->fp;//get the filepointer for logs

//other code ..

}

最佳答案

看起来很多线程都可以访问您的 my_thread_context_t::fp 并且这正是问题所在FILE* 类型实际上是一个(不透明)指向 C 库使用的结构的指针。当多个线程修改该结构内容时,该结构内容可能会被损坏(或不一致)。您必须同步对 my_thread_context_t::fp 的访问。我建议在您的 ctx 结构中创建一个互斥锁(请参阅 pthread_mutex_initpthread_mutex_lockpthread_mutex_unlock)。每个线程应该在开始写入文件之前锁定它,并在完成写入时解锁它 - 为此目的的单独(内联)函数将是更好的设计,例如:

typedef struct
{
int fd;
pthread_mutex_t mutex;
FILE *fp; //filepointer for logs file
} my_thread_context_t;

my_thread_context_t ctx;
fp = fopen("Serverlog.log","a+");
pthread_mutex_init(&ctx.mutex);
ctx.fp = fp;

inline void write_to_log(my_thread_context_t* pCtx,const char* pcszMessage)
{
pthread_mutex_lock(&(pCtx->mutex));
/* here write to the log file */
pthread_mutex_unlock(&(pCtx->mutex));
}

如果您这样做,不仅安全,而且您也不必调用 fflush每次写入后(除非您希望日志始终保持同步)。

不要忘记在所有线程完成后(例如,在所有必要的 ptrhead_join 之后)调用 pthread_mutex_destroy

关于c - 结构体中的指针问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9630207/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com