C++ valgrind drd报告简单c++;程序w/boost::thread或pthread

C++ valgrind drd报告简单c++;程序w/boost::thread或pthread,c++,boost,pthreads,valgrind,boost-thread,C++,Boost,Pthreads,Valgrind,Boost Thread,我只是从boost复制了一个示例程序 它报告了许多错误,如下所示: ==1454== Thread 2: ==1454== Conflicting load by thread 2 at 0x100843650 size 4 ==1454== at 0x1006FD94E: putc (in /usr/lib/libSystem.B.dylib) ==1454== by 0x1005C0A18: std::ostream::put(char) (in /usr/lib/libstd

我只是从boost复制了一个示例程序

它报告了许多错误,如下所示:

==1454== Thread 2:
==1454== Conflicting load by thread 2 at 0x100843650 size 4
==1454==    at 0x1006FD94E: putc (in /usr/lib/libSystem.B.dylib)
==1454==    by 0x1005C0A18: std::ostream::put(char) (in /usr/lib/libstdc++.6.0.9.dylib)
==1454==    by 0x1005C0AC6: std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&) (in /usr/lib/libstdc++.6.0.9.dylib)
==1454==    by 0x10001BD32: increment_count() (libfbj.cpp:23)
==1454==    by 0x10001CCD6: boost::detail::thread_data<void (*)()>::run() (thread.hpp:62)
==1454==    by 0x10053DF17: thread_proxy (in /opt/local/lib/libboost_thread.dylib)
==1454==    by 0x1001005A5: vgDrd_thread_wrapper (drd_pthread_intercepts.c:341)
==1454==    by 0x1006AEFD5: _pthread_start (in /usr/lib/libSystem.B.dylib)
==1454==    by 0x1006AEE88: thread_start (in /usr/lib/libSystem.B.dylib)
==1454== Allocation context: Data section of /usr/lib/libSystem.B.dylib
==1454== Other segment start (thread 1)
==1454==    at 0x100102286: pthread_mutex_unlock (drd_pthread_intercepts.c:665)
==1454==    by 0x10001EBDE: boost::mutex::unlock() (mutex.hpp:72)
==1454==    by 0x10001EE5C: boost::unique_lock<boost::mutex>::~unique_lock() (locks.hpp:403)
==1454==    by 0x10001F097: boost::shared_mutex::lock() (shared_mutex.hpp:137)
==1454==    by 0x10001F10E: boost::lock_guard<boost::shared_mutex>::lock_guard(boost::shared_mutex&) (locks.hpp:257)
==1454==    by 0x10001F751: boost::thread* boost::thread_group::create_thread<void (*)()>(void (*)()) (thread_group.hpp:41)
==1454==    by 0x10001BC3F: main (libfbj.cpp:30)
==1454== Other segment end (thread 1)
==1454==    at 0x1006AEE52: __bsdthread_create (in /usr/lib/libSystem.B.dylib)
==1454==    by 0x100106D8E: pthread_create (drd_pthread_intercepts.c:457)
==1454==    by 0x10053D78A: boost::thread::start_thread() (in /opt/local/lib/libboost_thread.dylib)
==1454==    by 0x10001F31A: boost::thread::thread<void (*)()>(void (*)(), boost::disable_if<boost::is_convertible<void (*&)(), boost::detail::thread_move_t<void (*)()> >, boost::thread::dummy*>::type) (thread.hpp:205)
==1454==    by 0x10001F771: boost::thread* boost::thread_group::create_thread<void (*)()>(void (*)()) (thread_group.hpp:42)
==1454==    by 0x10001BC3F: main (libfbj.cpp:30)
...
==1454== ERROR SUMMARY: 49 errors from 6 contexts (suppressed: 215 from 39)
我也尝试过pthread,下面是程序

#include <pthread.h>
#include <assert.h>
#include <iostream>

#define NUM_THREADS 5

pthread_mutex_t m_mutex;

void *TaskCode(void *argument)
{
    pthread_mutex_lock(&m_mutex);
    std::cout << "Hello World! It's me, thread " << *((int *) argument) << std::endl;
    pthread_mutex_unlock(&m_mutex);
    return NULL;
}

int main(void)
{
    pthread_mutex_init(&m_mutex,0);
    pthread_t threads[NUM_THREADS];
    int thread_args[NUM_THREADS];
    int rc, i;

    // create all threads 
    for (i=0; i<NUM_THREADS; ++i) {
        thread_args[i] = i;
        rc = pthread_create(&threads[i], NULL, TaskCode, (void *) &thread_args[i]);
        assert(0 == rc);
    }

    // wait for all threads to complete
    for (i=0; i<NUM_THREADS; ++i) {
        rc = pthread_join(threads[i], NULL);
        assert(0 == rc);
    }

    pthread_mutex_destroy(&m_mutex);
    return 0;
}
#包括
#包括
#包括
#定义NUM_线程5
pthread_mutex_t m_mutex;
void*任务代码(void*参数)
{
pthread_mutex_lock(&m_mutex);

std::cout可能什么都没有。如果在join_all()返回后的一段时间内睡眠()而不是立即退出进程,会发生什么情况?这会减少Valgrind输出文件的大小吗?我尝试过了,但没有减少大小。错误的数量是随机的,即每次运行时,它都会报告不同数量的错误。哦:(我有点希望一些额外的时间可以给boost库和运行时代码更多的时间来删除/释放与线程相关的对象/结构/任何东西。已经有报道说@user600502出现了类似的问题-多么令人惊讶,虚假的Valgrind报告。。。
==1454== Thread 2:
==1454== Conflicting load by thread 2 at 0x100843650 size 4
==1454==    at 0x1006FD94E: putc (in /usr/lib/libSystem.B.dylib)
==1454==    by 0x1005C0A18: std::ostream::put(char) (in /usr/lib/libstdc++.6.0.9.dylib)
==1454==    by 0x1005C0AC6: std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&) (in /usr/lib/libstdc++.6.0.9.dylib)
==1454==    by 0x10001BD32: increment_count() (libfbj.cpp:23)
==1454==    by 0x10001CCD6: boost::detail::thread_data<void (*)()>::run() (thread.hpp:62)
==1454==    by 0x10053DF17: thread_proxy (in /opt/local/lib/libboost_thread.dylib)
==1454==    by 0x1001005A5: vgDrd_thread_wrapper (drd_pthread_intercepts.c:341)
==1454==    by 0x1006AEFD5: _pthread_start (in /usr/lib/libSystem.B.dylib)
==1454==    by 0x1006AEE88: thread_start (in /usr/lib/libSystem.B.dylib)
==1454== Allocation context: Data section of /usr/lib/libSystem.B.dylib
==1454== Other segment start (thread 1)
==1454==    at 0x100102286: pthread_mutex_unlock (drd_pthread_intercepts.c:665)
==1454==    by 0x10001EBDE: boost::mutex::unlock() (mutex.hpp:72)
==1454==    by 0x10001EE5C: boost::unique_lock<boost::mutex>::~unique_lock() (locks.hpp:403)
==1454==    by 0x10001F097: boost::shared_mutex::lock() (shared_mutex.hpp:137)
==1454==    by 0x10001F10E: boost::lock_guard<boost::shared_mutex>::lock_guard(boost::shared_mutex&) (locks.hpp:257)
==1454==    by 0x10001F751: boost::thread* boost::thread_group::create_thread<void (*)()>(void (*)()) (thread_group.hpp:41)
==1454==    by 0x10001BC3F: main (libfbj.cpp:30)
==1454== Other segment end (thread 1)
==1454==    at 0x1006AEE52: __bsdthread_create (in /usr/lib/libSystem.B.dylib)
==1454==    by 0x100106D8E: pthread_create (drd_pthread_intercepts.c:457)
==1454==    by 0x10053D78A: boost::thread::start_thread() (in /opt/local/lib/libboost_thread.dylib)
==1454==    by 0x10001F31A: boost::thread::thread<void (*)()>(void (*)(), boost::disable_if<boost::is_convertible<void (*&)(), boost::detail::thread_move_t<void (*)()> >, boost::thread::dummy*>::type) (thread.hpp:205)
==1454==    by 0x10001F771: boost::thread* boost::thread_group::create_thread<void (*)()>(void (*)()) (thread_group.hpp:42)
==1454==    by 0x10001BC3F: main (libfbj.cpp:30)
...
==1454== ERROR SUMMARY: 49 errors from 6 contexts (suppressed: 215 from 39)
sudo ./bjam variant=debug define=BOOST_LOG_USE_CHAR architecture=combined address-model=32_64 link=shared,static threading=multi install
#include <pthread.h>
#include <assert.h>
#include <iostream>

#define NUM_THREADS 5

pthread_mutex_t m_mutex;

void *TaskCode(void *argument)
{
    pthread_mutex_lock(&m_mutex);
    std::cout << "Hello World! It's me, thread " << *((int *) argument) << std::endl;
    pthread_mutex_unlock(&m_mutex);
    return NULL;
}

int main(void)
{
    pthread_mutex_init(&m_mutex,0);
    pthread_t threads[NUM_THREADS];
    int thread_args[NUM_THREADS];
    int rc, i;

    // create all threads 
    for (i=0; i<NUM_THREADS; ++i) {
        thread_args[i] = i;
        rc = pthread_create(&threads[i], NULL, TaskCode, (void *) &thread_args[i]);
        assert(0 == rc);
    }

    // wait for all threads to complete
    for (i=0; i<NUM_THREADS; ++i) {
        rc = pthread_join(threads[i], NULL);
        assert(0 == rc);
    }

    pthread_mutex_destroy(&m_mutex);
    return 0;
}
==71472== Thread 2:
==71472== Conflicting load by thread 2 at 0x1001fd650 size 4
==71472==    at 0x1000933DB: fwrite (in /usr/lib/libSystem.B.dylib)
==71472==    by 0x1002ADAE3: void std::__ostream_write<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long) (in /usr/lib/libstdc++.6.0.9.dylib)
==71472==    by 0x1002ABB97: std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long) (in /usr/lib/libstdc++.6.0.9.dylib)
==71472==    by 0x1002ABC57: std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*) (in /usr/lib/libstdc++.6.0.9.dylib)
==71472==    by 0x100000C46: TaskCode(void*) (in ./threaded_group)
==71472==    by 0x1000145A5: vgDrd_thread_wrapper (drd_pthread_intercepts.c:341)
==71472==    by 0x100068FD5: _pthread_start (in /usr/lib/libSystem.B.dylib)
==71472==    by 0x100068E88: thread_start (in /usr/lib/libSystem.B.dylib)
==71472== Allocation context: Data section of /usr/lib/libSystem.B.dylib
==71472== Other segment start (thread 1)
==71472==    at 0x10001AE58: pthread_create (drd_pthread_intercepts.c:468)
==71472==    by 0x100000B70: main (in ./threaded_group)
==71472== Other segment end (thread 1)
==71472==    at 0x100068E52: __bsdthread_create (in /usr/lib/libSystem.B.dylib)
==71472==    by 0x10001AD8E: pthread_create (drd_pthread_intercepts.c:457)
==71472==    by 0x100000B70: main (in ./threaded_group)
==71472== Other segment start (thread 1)
==71472==    at 0x10001AE58: pthread_create (drd_pthread_intercepts.c:468)
==71472==    by 0x100000B70: main (in ./threaded_group)
==71472== Other segment end (thread 1)
==71472==    at 0x100068E52: __bsdthread_create (in /usr/lib/libSystem.B.dylib)
==71472==    by 0x10001AD8E: pthread_create (drd_pthread_intercepts.c:457)
==71472==    by 0x100000B70: main (in ./threaded_group)
==71472== Other segment start (thread 1)
==71472==    at 0x10001AE58: pthread_create (drd_pthread_intercepts.c:468)
==71472==    by 0x100000B70: main (in ./threaded_group)
==71472== Other segment end (thread 1)
==71472==    at 0x100068E52: __bsdthread_create (in /usr/lib/libSystem.B.dylib)
==71472==    by 0x10001AD8E: pthread_create (drd_pthread_intercepts.c:457)
==71472==    by 0x100000B70: main (in ./threaded_group)
...
==71472== ERROR SUMMARY: 11 errors from 6 contexts (suppressed: 70 from 29)