Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;使用不同gcc优化的不同错误_C++_Multithreading_Gcc - Fatal编程技术网

C++ C++;使用不同gcc优化的不同错误

C++ C++;使用不同gcc优化的不同错误,c++,multithreading,gcc,C++,Multithreading,Gcc,使用不同的gcc优化,我的程序由于不同的操作系统信号而死亡,我想知道原因是否相同 我在用O2.编译的C++多线程程序中得到了一个异常的转储()。p> Program terminated with signal 6, Aborted. #0 0x00007ff2572d28a5 in raise () from /lib64/libc.so.6 我只是无法找出原因,因为它似乎在本地std::vector析构函数中。。那没有什么意义 对我来说很有道理 (gdb) thread 1 [Switc

使用不同的gcc优化,我的程序由于不同的操作系统信号而死亡,我想知道原因是否相同

我在用O2.编译的C++多线程程序中得到了一个异常的转储()。p>

Program terminated with signal 6, Aborted.
#0  0x00007ff2572d28a5 in raise () from /lib64/libc.so.6
我只是无法找出原因,因为它似乎在本地std::vector析构函数中。。那没有什么意义 对我来说很有道理

(gdb) thread 1
[Switching to thread 1 (Thread 0x7ff248d6c700 (LWP 16767))]#0  0x00007ff2572d28a5 in raise () from /lib64/libc.so.6
(gdb) bt
#0  0x00007ff2572d28a5 in raise () from /lib64/libc.so.6
#1  0x00007ff2572d4085 in abort () from /lib64/libc.so.6
#2  0x00007ff25730fa37 in __libc_message () from /lib64/libc.so.6
#3  0x00007ff257315366 in malloc_printerr () from /lib64/libc.so.6
#4  0x00007ff257317e93 in _int_free () from /lib64/libc.so.6
#5  0x000000000044dd45 in deallocate (this=0x7ff250389610) at /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ext/new_allocator.h:95
#6  _M_deallocate (this=0x7ff250389610) at /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_vector.h:146
#7  ~_Vector_base (this=0x7ff250389610) at /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_vector.h:132
#8  ~vector (this=0x7ff250389610) at /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_vector.h:313
#9  ...
深入研究代码,我意识到向量是使用来自其他线程的另一个向量进行初始化的, 重点是,没有使用互斥来实现这一点。为了简化 我写了这段代码来复制它。(请忽略stopThread未受保护)

void*doWork(void*)
{
而(!stopThread)
{
双最小值=标准::数值限制::最大值();
double max=std::numeric_limits::min();
pthread_mutex_lock(&_mutex);
std::vector localVector=(sharedVector);
sharedVector.clear();
pthread_mutex_unlock(&_mutex);
for(无符号整数索引=0;索引std::cout在工作线程访问共享向量时锁定互斥体,但在主线程修改它时不锁定互斥体。您需要保护对共享可变数据的所有访问

for(int i = 0; i < 10000; i++)
{
    pthread_mutex_lock(&_mutex);                // Add this
    sharedVector.push_back(i);
    pthread_mutex_unlock(&_mutex);              // Add this
    std::cout << "Thread 1 " << i << std::endl;
    usleep(5000);
}
for(int i=0;i<10000;i++)
{
pthread_mutex_lock(&_mutex);//添加这个
sharedVector.推回(i);
pthread_mutex_unlock(&_mutex);//添加此

std::cout在工作线程访问共享向量时锁定互斥体,但在主线程修改它时不锁定互斥体。您需要保护对共享可变数据的所有访问

for(int i = 0; i < 10000; i++)
{
    pthread_mutex_lock(&_mutex);                // Add this
    sharedVector.push_back(i);
    pthread_mutex_unlock(&_mutex);              // Add this
    std::cout << "Thread 1 " << i << std::endl;
    usleep(5000);
}
for(int i=0;i<10000;i++)
{
pthread_mutex_lock(&_mutex);//添加这个
sharedVector.推回(i);
pthread_mutex_unlock(&_mutex);//添加此

std::正常情况下,这是否意味着你有一个潜在的问题,只是随意地进行一些优化。例如,一些未定义的行为,对无效内存的访问。在调试(
-Og
)中,它会崩溃?你的GCC很旧(当前的是4.9)。请尝试安装一个较新的GCC,并使用其
-fsanizize=address
-fsanizize=thread
选项。是的,它在调试模式下确实会崩溃。当您有UB时,不可能升级gccYes。编译器优化之间的行为可能会有所不同。通常这意味着您有一个潜在的问题,只是偶然出现在他身上自我优化。例如一些未定义的行为,对无效内存的访问。在调试(
-Og
)中,它会崩溃?您的GCC非常旧(当前的是4.9)。请尝试安装一个较新的GCC,并使用其
-fsanitize=address
-fsanitize=thread
选项。是的,它在调试模式下会崩溃。当您有UB时,无法升级GCCYE。编译器优化之间的行为可能会有所不同。
for(int i = 0; i < 10000; i++)
{
    pthread_mutex_lock(&_mutex);                // Add this
    sharedVector.push_back(i);
    pthread_mutex_unlock(&_mutex);              // Add this
    std::cout << "Thread 1 " << i << std::endl;
    usleep(5000);
}