多线程都调用一个函数,在这个函数中的一个局部变量什么情况会被修改

C++语言 码拜 9年前 (2016-04-25) 1890次浏览
情况是这样的
C++写的主线程用_beginthreadex函数启动了多个线程,这些线程都会调用这样一个函数,这个函数获取的系统时间在前后被改变了,函数简化描述如下:
void abcd()
{
/*获取系统当前时间*/
SYSTEMTIME sysStartTime;
GetLocalTime( &sysStartTime );
int yearyear=sysStartTime.wYear;
int monthmonth=sysStartTime.wMonth;
int dayday=sysStartTime.wDay;
int hourhour=sysStartTime.wHour;
int minuteminute=sysStartTime.wMinute;
int secondsecond=sysStartTime.wSecond;
int msecmsec=sysStartTime.wMilliseconds;
//第一次输出
cout<<“数据”<<yearyear<<” “<<monthmonth<<” “<<dayday<<” “<<hourhour<<” “<<minuteminute<<” “<<secondsecond<<” “<<msecmsec<<endl;
switch()
{
各种case,但是没有修改过sysStartTime,这里根据不同情况大致会执行1到10秒左右
}
//第二次输出,这两次输出结果有时候一致有时候不一致,第二次的时间比第一次小几秒
cout<<“数据”<<yearyear<<” “<<monthmonth<<” “<<dayday<<” “<<hourhour<<” “<<minuteminute<<” “<<secondsecond<<” “<<msecmsec<<endl;
}
问一下这个可能是什么问题
解决方案

20

每个线程都把要输出的内容放在局部变量里保存好,等事情干完了,加锁,输出,解锁。
就不会有那么多问题了;
大致意思如下:
thread_id = 获取线程ID();
time1 = 获取时间();
//干一些事情
time2 = 获取时间();
Lock();//加锁
cout << “本人是线程:” << thread_id << endl;
cout << “开始时间: ” << time1 << endl;
cout << “结束时间:” << time2 << endl;
cout << “耗时: ” << time2 – time1 << endl;
UnLock();//解锁
也就是说你这段内容:
–CE线程第4个事务,线程号:7844–
事务类型:TradeStatus
事务开始时间:2016/05/26 15:05:19.587
switch前2016 5 26 15 5 19 587
switch后2016 5 26 15 5 18 263
事务结束时间:2016/05/26 15:05:19.647
事务执行时间:1.384000s
集中在事情干完了以后加锁,整段输出,解锁。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明多线程都调用一个函数,在这个函数中的一个局部变量什么情况会被修改
喜欢 (0)
[1034331897@qq.com]
分享 (0)