一个获取唯一流水号的函数. 对于一个自增的局部静态变量,多个线程访问这个函数需要加锁吗?

baidu_28726667 2019-11-06 11:37:00
#include <afxwin.h>
#include <cstringt.h>
#include <stdio.h>
#include <iostream>
#include <ctime>
#include <thread>

std::string MyGetTime()
{
CString strTime; //用于将CTime对象格式化为字符串
CTime curTime = CTime::GetCurrentTime(); //获取当前的系统时间
int nYear = curTime.GetYear();
int nMonth = curTime.GetMonth();
int nDay = curTime.GetDay();
int nHour = curTime.GetHour();
int nMin = curTime.GetMinute();
int nSec = curTime.GetSecond();
strTime = curTime.Format(_T("%Y%m%d%H%M%S"));
return strTime.GetString();
}

void GetSeqNo(std::string& _sNewSeqNo)
{

static int nSeqNo = 0; /*用于每次自增的序列号*/


nSeqNo > 99999 ? nSeqNo = 0 : nSeqNo++;

std::string sCurrentTime = MyGetTime(); /*获取当前时间*/

/*开始拼接流水号*/
char pszTempSeq[64 + 1];
memset(pszTempSeq,0x00,sizeof(pszTempSeq));
snprintf(pszTempSeq,sizeof(pszTempSeq),"%s%05d", sCurrentTime.c_str(), nSeqNo);
_sNewSeqNo = pszTempSeq;

}

void threadTest()
{
std::string sNewSeqNo;
GetSeqNo(sNewSeqNo);
printf("当前线程: %lu , 新的序列号: %s\n", GetCurrentThreadId(), sNewSeqNo.c_str());
return;
}


int main(void)
{

for (int ii = 0; ii < 100; ii++)
{
std::thread t1(threadTest);
t1.detach();
}

system("pause");
return 0;
}





此函数作用是获取一个唯一的流水号:   会不会有可能出现重复的流水号?!  
...全文
152 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lin5161678 2019-11-26
  • 打赏
  • 举报
回复
引用 6 楼 baidu_28726667 的回复:
每一个线程进去的事情基本就是+1了,意思是这还有可能两个线程同时读取到同一个数值然后++ ?
++ 至少要分成3个步骤 1. 内存数据 mov到寄存器 2. 寄存器数据 + 1 3. 寄存器数据 mov到内存 第三步完成之前 切换到另一个线程 读取到一样的内存数据 是完全正常的
jiht594 2019-11-26
  • 打赏
  • 举报
回复
引用 6 楼 baidu_28726667 的回复:
每一个线程进去的事情基本就是+1了,意思是这还有可能两个线程同时读取到同一个数值然后++ ?

为什么不可能
baidu_28726667 2019-11-26
  • 打赏
  • 举报
回复
引用 5 楼 lin5161678 的回复:
[quote=引用 3 楼 baidu_28726667 的回复:] [quote=引用 2 楼 自信男孩 的回复:] 需要加的,因为用的是静态变量,每个线程调用该函数,对静态变量操作(写)就会修改其值。如果另一个线程也在调用这个函数, 要读取该静态变量可能读到的值可能是另一个线程写之后的或者写之前的。
修改前和修改后我没所谓的,只要没有线程读出来是一样的就可以了[/quote]不加锁的话 不保证读出来不一样的 有可能得到相同id [/quote]
引用 5 楼 lin5161678 的回复:
[quote=引用 3 楼 baidu_28726667 的回复:] [quote=引用 2 楼 自信男孩 的回复:] 需要加的,因为用的是静态变量,每个线程调用该函数,对静态变量操作(写)就会修改其值。如果另一个线程也在调用这个函数, 要读取该静态变量可能读到的值可能是另一个线程写之后的或者写之前的。
修改前和修改后我没所谓的,只要没有线程读出来是一样的就可以了[/quote]不加锁的话 不保证读出来不一样的 有可能得到相同id [/quote] 每一个线程进去的事情基本就是+1了,意思是这还有可能两个线程同时读取到同一个数值然后++ ?
lin5161678 2019-11-07
  • 打赏
  • 举报
回复
引用 3 楼 baidu_28726667 的回复:
[quote=引用 2 楼 自信男孩 的回复:] 需要加的,因为用的是静态变量,每个线程调用该函数,对静态变量操作(写)就会修改其值。如果另一个线程也在调用这个函数, 要读取该静态变量可能读到的值可能是另一个线程写之后的或者写之前的。
修改前和修改后我没所谓的,只要没有线程读出来是一样的就可以了[/quote]不加锁的话 不保证读出来不一样的 有可能得到相同id
lin5161678 2019-11-07
  • 打赏
  • 举报
回复
可以加锁 但不建议 这种情况 显然 原子操作就足够了
baidu_28726667 2019-11-07
  • 打赏
  • 举报
回复
引用 2 楼 自信男孩 的回复:
需要加的,因为用的是静态变量,每个线程调用该函数,对静态变量操作(写)就会修改其值。如果另一个线程也在调用这个函数, 要读取该静态变量可能读到的值可能是另一个线程写之后的或者写之前的。
修改前和修改后我没所谓的,只要没有线程读出来是一样的就可以了
不闻窗外事 2019-11-06
  • 打赏
  • 举报
回复
理论上是要加的
自信男孩 2019-11-06
  • 打赏
  • 举报
回复
需要加的,因为用的是静态变量,每个线程调用该函数,对静态变量操作(写)就会修改其值。如果另一个线程也在调用这个函数,
要读取该静态变量可能读到的值可能是另一个线程写之后的或者写之前的。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧