gpt4 book ai didi

c++ - 如何实现线程安全的功能

转载 作者:行者123 更新时间:2023-11-30 20:50:33 29 4
gpt4 key购买 nike

我正在从宏调用一个函数(返回字符串)。系统中多个线程可以使用该宏。

例如:

#define LOG(app,str) printf("App =%d\n, Ouptut String = %s\n",app, 
foo str );


char* foo(const char *fmt, ...) {
static char logmsg[200]; //Maximum log Msg String length
va_list args;
va_start(args, fmt);
vsprintf(logmsg,fmt, args);
va_end(args);
return logmsg;
}



LOG Macro Usage : LOG(15,("Msg=%s\n",strvariable));

现在就我而言,函数 foo() 不是线程安全的。有什么方法可以在不使用互斥锁的情况下使这个宏/函数成为线程安全的吗???

最佳答案

您正在寻求保护内部缓冲区。显然,您不能在函数中应用互斥锁或原子锁,因为该缓冲区是在函数外部使用的。

忽略设计和实现中的明显缺陷(没有保护的固定长度缓冲区等......)有一种方法可以保护缓冲区。

即使其成为thread_local:

char* foo(const char *fmt, ...) {

// thread_local
thread_local static char logmsg[200]; //Maximum log Msg String length

va_list args;
va_start(args, fmt);
std::vsprintf(logmsg,fmt, args);
va_end(args);
return logmsg;
}

只要您不在线程之间编码(marshal)返回的指针,就可以了。

请注意,thread_local是c++11的特性,苹果编译器在为iOS编译时仍然没有实现它。解决这个废话的方法是 boost::thread_specific_ptr

关于c++ - 如何实现线程安全的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44283313/

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