|
|
1
2
如果你的意思是“对来电者没有影响”,那么你的选择是非常有限的。您不能返回需要调用方释放的任何内容。 冒着用一个坏的解决方案替换另一个坏的解决方案的风险,最快和最简单的解决方案可能是这样的:不要使用单一的静态缓冲区,而是使用它们的池,并在每次调用函数时循环使用它们。确保选择缓冲区的代码是线程安全的。 |
|
|
2
2
听起来系统是线程化的,对吗?如果只是因为在您仍然使用之前的输出时再次调用其中一个函数不安全,那么每次都应该以相同的方式进行。
大多数编译器都有一种将变量标记为“线程本地数据”的方法,以便根据访问它的线程的不同,该变量具有不同的地址。在gcc中,它是
如果您需要能够在不覆盖结果的情况下从同一线程多次调用这些函数,我看不到任何完整的解决方案,只能强制调用方释放结果。您可以使用一种混合方法,其中每个线程都有固定数量的缓冲区,这样调用者可以在不覆盖先前结果的情况下进行多达N次调用,而不管其他线程在做什么。 |
|
|
3
1
您发布的代码有一个巨大的问题-如果调用方将返回值分配给const char*,编译器将进行静默转换并销毁临时CoreString对象。现在您的指针将无效。 |
|
|
4
1
我不知道呼叫者将如何使用它,但是使用
如果不能使用动态存储,那么就只能使用非动态存储,如果不使用缓冲区循环池或线程本地缓冲区之类的东西,就真的没什么可做的了。 |
|
|
5
0
“间歇性高负载错误”是由争用条件引起的,其中一个线程在另一个线程使用完静态缓冲区之前踩坏了静态缓冲区,对吗? 所以,切换到使用每个线程的输出缓冲区,使用平台提供的任何线程本地存储机制(我想是Windows)。 没有同步争用,线程之间没有干扰,并且根据您所说的当前实现旋转缓冲区,几乎可以肯定调用代码根本不需要更改。如果当前实现使用多个缓冲区,它不能依赖于每次使用的相同缓冲区。 我可能不会从头开始这样设计API,但它实现了您当前的API,而不会对其进行重大更改,也不会影响性能。 |
|
|
Glory Raj · 有什么方法可以使这两个块具有共同的功能吗 3 年前 |
|
|
Justin · Python自属性重命名 8 年前 |
|
|
Sabutobi · 长dict属性行的重构 8 年前 |
|
|
Falco Alexander · 简单LINQ重构/样式 8 年前 |
|
|
05bs001 · Euler 12需要优化 8 年前 |
|
|
slartidan · 如何将lambda表达式重构为方法引用? 8 年前 |
|
|
Alex · 在Java类中频繁使用与映射键相同的字符串[已关闭] 8 年前 |