From: "David Schwartz" <davids@webmaster.com>
To: "Andrew Haley" <aph@redhat.com>
Cc: "Linux Kernel Mailing List" <linux-kernel@vger.kernel.org>,
"Tomash Brechko" <tomash.brechko@gmail.com>
Subject: RE: Is gcc thread-unsafe?
Date: Fri, 2 Nov 2007 10:18:10 -0700 [thread overview]
Message-ID: <MDEHLPKNGKAHNMBLJOLKIEJIHPAC.davids@webmaster.com> (raw)
In-Reply-To: <e2e108260711020829p5994f79bp48ca35a1ce84ff03@mail.gmail.com>
> Another conclusion from the cited text is that in contrast with what
> was stated before on the gcc mailing list, it is not required to
> declare thread-shared variables volatile if that thread-shared data is
> consistently protected by calls to locking functions.
>
> Bart Van Assche.
It all depends upon what threading standard you are using. If GCC is going
to support POSIX threading, it cannot require that thread-shared data be
marked 'volatile' since POSIX does not require this.
It can offer semantic guarantees for volatile-qualified data if it wants to.
But POSIX provides a set of guarantees that do not require marking data as
'volatile' and if GCC is going to support POSIX threading, it has to support
providing those guarantees.
As far as I know, no threading standard either requires 'volatile' or states
that it is sufficient for any particular purpose. So there seems to be no
reason to declare thread-shared variables as
volatile except as some kind of platform-specific optimization.
POSIX mutexes are sufficient. They are necessary if there is no other way to
get the guarantees you need. Nothing prevents GCC from providing any
guarantees it wants for 'volatile' qualified data. But POSIX mutexes must
work as POSIX specifies or GCC cannot support POSIX threading.
This is the nightmare scenario (thanks to Hans-J. Boehm):
int x;
bool need_to_lock;
pthread_mutex_t mutex;
for(int i=0; i<50; i++)
{
if(unlikely(need_to_lock)) pthread_mutex_lock(&mutex);
x++;
if(unlikely(need_to_lock)) pthread_mutex_unlock(&mutex);
}
Now suppose the compiler optimizes this as follows:
register=x;
for(int i=0; i<50; i++)
{
if(need_to_lock)
{
x=register; pthread_mutex_lock(&mutex) register=x;
}
register++;
if(need_to_lock)
{
x=register; pthread_mutex_unlock(&mutex); register=x;
}
}
x=register;
This is a perfectly legal optimization for single-threaded code. It may in
fact be an actual optimization. Clearly, it totally destroys threaded code.
This shows that, unfortunately, the normal assumption that not knowing
anything about the pthread functions ensures that optimizations won't break
them is incorrect.
DS
next prev parent reply other threads:[~2007-11-02 17:18 UTC|newest]
Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <e2e108260710260729x4603211cgb68d7434ce1e54e9@mail.gmail.com>
2007-10-26 14:40 ` Bart Van Assche
2007-10-26 15:09 ` Linus Torvalds
2007-10-26 15:34 ` Andrew Haley
2007-10-26 18:06 ` David Schwartz
2007-10-30 10:20 ` Andrew Haley
2007-11-02 15:29 ` Bart Van Assche
2007-11-02 15:38 ` Andrew Haley
2007-11-04 15:13 ` Bart Van Assche
2007-11-04 17:45 ` Linus Torvalds
2007-11-04 17:58 ` Andrew Haley
2007-11-04 18:06 ` Bart Van Assche
2007-11-02 17:18 ` David Schwartz [this message]
2007-10-26 21:45 ` Giacomo Catenazzi
2007-10-26 22:24 ` Linus Torvalds
2007-10-26 15:27 ` Linus Torvalds
2007-10-26 16:28 ` Linus Torvalds
2007-10-26 17:07 ` Bart Van Assche
2007-10-26 17:12 ` Andrew Haley
2007-10-26 17:25 ` Linus Torvalds
2007-10-26 18:08 ` Alan Cox
2007-10-26 18:14 ` Linus Torvalds
2007-10-26 20:39 ` Andi Kleen
2007-10-28 18:19 linux
[not found] <fa.JbRGo0cQWncrcfKHmiNdvchsA50@ifi.uio.no>
[not found] ` <fa.8qDECVaPIo7DWbjhQbyw6N5Infg@ifi.uio.no>
[not found] ` <fa.M4DOMggyrQmdTqekWSuw4xCxiTc@ifi.uio.no>
2007-10-25 23:27 ` Robert Hancock
-- strict thread matches above, loose matches on Subject: below --
2007-10-25 3:24 Nick Piggin
2007-10-25 3:46 ` Arjan van de Ven
2007-10-25 3:58 ` Nick Piggin
2007-10-25 4:29 ` David Schwartz
2007-10-25 4:35 ` Arjan van de Ven
2007-10-25 18:45 ` Måns Rullgård
2007-10-25 4:47 ` Nick Piggin
2007-10-25 9:40 ` Samuel Tardieu
2007-10-25 9:44 ` Samuel Tardieu
2007-10-25 9:54 ` Samuel Tardieu
2007-10-25 9:55 ` Andi Kleen
2007-10-25 7:15 ` Andi Kleen
2007-10-25 11:58 ` linux-os (Dick Johnson)
2007-10-25 12:16 ` Andi Kleen
2007-10-25 22:49 ` Nick Piggin
2007-10-25 23:09 ` Andi Kleen
2007-10-25 23:14 ` Linus Torvalds
2007-10-25 23:16 ` Andi Kleen
2007-10-25 23:32 ` Linus Torvalds
2007-10-25 23:42 ` Andi Kleen
2007-10-25 23:57 ` Linus Torvalds
2007-10-26 1:15 ` Zachary Amsden
2007-10-26 4:57 ` Willy Tarreau
2007-10-25 23:43 ` Nick Piggin
2007-10-25 23:55 ` Andi Kleen
2007-10-25 23:57 ` Nick Piggin
2007-10-25 14:55 ` Linus Torvalds
2007-10-25 15:12 ` Pekka Enberg
2007-10-25 21:42 ` David Schwartz
2007-10-25 23:22 ` Nick Piggin
2007-10-26 11:59 ` Andrew Haley
2007-10-26 11:59 ` Andrew Haley
2007-10-26 17:39 ` Chris Friesen
2007-10-25 22:26 ` Ismail Dönmez
2007-10-25 22:56 ` Jeff Garzik
2007-10-25 23:04 ` Jeff Garzik
2007-10-31 22:10 ` Phillip Susi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=MDEHLPKNGKAHNMBLJOLKIEJIHPAC.davids@webmaster.com \
--to=davids@webmaster.com \
--cc=aph@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=tomash.brechko@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®