gpt4 book ai didi

c++ - 需要在 Solaris 10 上为 GNU g++ 2.95.3 放置线程安全的 std::string

转载 作者:行者123 更新时间:2023-11-28 02:17:29 28 4
gpt4 key购买 nike

std::string 在 Soalris 10(使用 GNU g++ 2.95.3 编译)上显示线程不安全行为。这是我的示例程序:

#include <iostream>
#include <string>
#include <pthread.h>
#include <stdio.h>
using namespace std;
void *Loop(void *) {
while(1) {
string *ps = new string("Hi");
if (ps == NULL) {
fprintf(stdout, "string creation failed\n");
}}}
int main (int argc, char **argv) {
pthread_t thread1, thread2;
fprintf(stdout, "creating threads\n");
if(pthread_create(&thread1, NULL, Loop, NULL) == 0)
fprintf(stdout, "thread 1 created\n");
if(pthread_create(&thread2, NULL, Loop, NULL) == 0)
fprintf(stdout, "thread 2 created\n");
while(1);
return 0;
}

我将源代码 (testSTL.c) 编译为:

g++ -c teststl.c
g++ -o teststl teststl.o -lthread

使用的平台和编译器是:

Platform: Solaris 10
Compiler GNU g++ 2.95.3

当我运行它时:它显示,

creating threads
thread 1 created
thread 2 created
./runteststl: line 5: 1412 Bus Error (core dumped) ./teststl

以下是“pstack 核心”的转储

core 'core' of 14353:   ./teststl
----------------- lwp# 1 / thread# 1 --------------------
00011a7c main (1, ffbff9cc, ffbff9d4, 232f8, ff2f00c0, 0) + b4
00011798 _start (0, 0, 0, 0, 0, 0) + 5c
----------------- lwp# 2 / thread# 2 --------------------
000121ec allocate__t24__default_alloc_template2b0i0Ui (20, 20, 23104, 69, 0, 0)
+ a4
00012220 __nw__Q2t12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc
_template2b0i0_3RepUiUi (10, 10, ff000000, 0, 0, 1) + 14
00012260 create__Q2t12basic_string3ZcZt18string_char_traits1ZcZt24__default_all
oc_template2b0i0_3RepUi (2, 2, ff000000, 2, 1f, fffc00) + 24
000127a4 replace__t12basic_string3ZcZt18string_char_traits1ZcZt24__default_allo
c_template2b0i0UiUiPCcUi (8df70, 0, ffffffff, 12a48, 2, 80808080) + 114
00012a24 assign__t12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc
_template2b0i0PCcUi (8df70, 12a48, 2, 0, ff1c0200, ff1b9210) + 24
000129e4 assign__t12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc
_template2b0i0PCc (8df70, 12a48, d9fd8, 129e4, ff1b03a8, ff1ba518) + 24
00012948 __t12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_templ
ate2b0i0PCc (8df70, 12a48, 12800, 0, ff1c0200, 1) + 28
00011908 Loop__FPv (0, ff07c000, 0, 0, 118d0, 0) + 38
ff148a20 _lwp_start (0, 0, 0, 0, 0, 0)
----------------- lwp# 3 / thread# 3 --------------------
000121ec allocate__t24__default_alloc_template2b0i0Ui (20, 20, 23104, 69, 0, 0)
+ a4
00012220 __nw__Q2t12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc
_template2b0i0_3RepUiUi (10, 10, ff000000, 0, 0, 1) + 14
00012260 create__Q2t12basic_string3ZcZt18string_char_traits1ZcZt24__default_all
oc_template2b0i0_3RepUi (2, 2, ff000000, 2, 1, fffc00) + 24
000127a4 replace__t12basic_string3ZcZt18string_char_traits1ZcZt24__default_allo
c_template2b0i0UiUiPCcUi (8df60, 0, ffffffff, 12a48, 2, 80808080) + 114
00012a24 assign__t12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc
_template2b0i0PCcUi (8df60, 12a48, 2, 0, ff1c0a00, ff1b9210) + 24
000129e4 assign__t12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc
_template2b0i0PCc (8df60, 12a48, d9fd8, 129e4, ff1b03a8, ff1ba518) + 24
00012948 __t12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_templ
ate2b0i0PCc (8df60, 12a48, 12800, 0, ff1c0a00, 1) + 28
00011908 Loop__FPv (0, fef7c000, 0, 0, 118d0, 0) + 38
ff148a20 _lwp_start (0, 0, 0, 0, 0, 0)

这显示了争用问题。与编译或链接标志有关吗?尝试了来自 https://docs.oracle.com/cd/E19455-01/806-5257/compile-94179/index.html 的建议但这也没有用。有什么建议吗?

最佳答案

崩溃发生在 std::allocator 内部,所以我假设它在 GCC 2.95.3 中不是正确的线程安全的,但我不会挖掘出古老的代码来检查。

停止使用这样的遗物。

关于c++ - 需要在 Solaris 10 上为 GNU g++ 2.95.3 放置线程安全的 std::string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33628980/

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