myaegean 发表于 2014-07-07 18:21

多线程写同一个日志文件的问题

最近我做了个日志管理系统,可以让多个线程向同一个日志文件中写入日志。我使用了并且使用了mutex lock实现了并发访问问题。不过测试时如果线程pthread_create传参数,就有问题。

pthread_create(&ntid, NULL, thr_fn, &param);/*多线程并发写日志异常*/

pthread_create(&ntid, NULL, thr_fn, NULL);/* 多线程并发写日志正常 */

详细代码见附件:
编译用scons。 默认宏ENABLE_PARM打开,运行生成的日志文件就有问题。
修改文件SConstruct关闭宏ENABLE_PARM, 然后编译,运行的日志就没有问题。

坐等大虾出现!

hellioncu 发表于 2014-07-08 08:45

那是因为ThrParams_t param;是在栈里面的,函数thread_gen退出就失效了,但你的线程还在访问。
解决办法:ThrParams_t param放到函数外边,或者改用malloc申请

myaegean 发表于 2014-07-09 11:41

谢谢大虾指点迷津,我把参数param在thr_fn转存了一下,问题解决了。
void *thr_fn(void *arg)
{
    int i;
#ifdef ENABLE_PARM
    ThrParams_t stParam;
    memset(&stParam, 0x00, sizeof(ThrParams_t));
    memcpy(&stParam, (ThrParams_t*)arg, sizeof(ThrParams_t)); // Store the contents of parameter which is local variable in thread_gen().

    for(i = 0; i < stParam.iLogNum; i ++)
    {   
      logging(LOG_INFOR, "[%s]pid=%u tid=%u loop=%d/%d\n", stParam.szThrName, getpid(), pthread_self(), i, stParam.iLogNum);
    }   
#else
    for(i = 0; i < MAX_COUNT_NUM; i ++)
    {   
      logging(LOG_INFOR, "pid=%u tid=%u loop=%d\n", getpid(), pthread_self(), i);
    }   
#endif
    return ((void *)0);
}

hellioncu 发表于 2014-07-10 10:02

myaegean 发表于 2014-07-09 11:41 static/image/common/back.gif
谢谢大虾指点迷津,我把参数param在thr_fn转存了一下,问题解决了。

你这样只是降低了问题的概率,不是根本解决
页: [1]
查看完整版本: 多线程写同一个日志文件的问题