https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70276
Bug ID: 70276
Summary: Writing to standard output concurrently through
`std::cout` triggers a datarace
Product: gcc
Version: 4.9.4
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: stefan at vectorfabrics dot com
Target Milestone: ---
Consider the following C++11 program:
#include
#include
#include
int main()
{
std::future future =
std::async(std::launch::async, []() { std::cout << "foo" << std::endl;
});
std::cout << "bar" << std::endl;
future.wait();
return EXIT_SUCCESS;
}
This program exhibits a datarace for the member variable
`std::ios_base::_M_width` of `std::cout`.
For example, Pareon Verify reports (some details elided for clarity):
[M0108] Data race(s) detected:
an object of size 272
is concurrently accessed by
the write in
function ios_base::width at .../include/bits/ios_base.h:656
called from function std::__ostream_insert at
.../include/bits/ostream_insert.h:102
called from function std::operator<< at .../include/ostream:535
called from function main at test.cpp:9
^^^ application start ^^^
performing 1 access of size 8 at an offset of 24 bytes from the start of
the object
and the read in
function ios_base::width at .../include/bits/ios_base.h:645
called from function std::__ostream_insert at
.../include/bits/ostream_insert.h:87
called from function std::operator<< at .../include/ostream:535
...
called from function execute_native_thread_routine at .../thread.cc:84
^^^ thread start ^^^
called from function pthread_create
...
called from function std::async at include/c++/4.9.2/future:1580
called from function main at test.cpp:8
^^^ application start ^^^
performing 1 access of size 8 at an offset of 24 bytes from the start of
the object
Helgrind produces a similar (albeit somewhat more cryptic) message.