2016-07-10 4 views
0

Ich bin ein Neuling in C.Zeigerdaten Rennen in C

int a = 1, b = 2; 
int *p = &a; 

wenn ein ThreadA wird, um den Zeiger zu ändern p von Zeige a-b zu zeigen, die gleichzeitig eine andere ThreadB Lesen ist Zeiger p, was Wert könnte threadB lesen? Könnte es ein gebrochener Wert sein (weder 1 noch 2)?

+2

Dies kann von der Plattform/OS abhängen - Warum also riskieren –

+1

Jeder ungeschützte gleichzeitige Zugriff auf eine Variable ist undefiniertes Verhalten. – 2501

+1

Nach dem c-Standard - ja, in allen Mainstream-Compilern/Plattformen - nein. – Dani

Antwort

0

In der Praxis werden Schreibvorgänge auf einem Zeiger auf populären modernen Plattformen atomar sein, wenn der Zeigerspeicher ausgerichtet ist. Welches ist in Ihrem Fall, wo der Zeiger auf dem Stapel zugeordnet ist. Wenn der Zeiger auf dem Heap gespeichert wäre, müssen Sie sicherstellen, dass er mit der richtigen Ausrichtung gespeichert wird.

In der Theorie, nein, es ist nicht sicher.

+0

In der Praxis können Compiler und Hardware die Schreib-/Lesevorgänge immer noch neu ordnen/eliminieren. – 2501

+1

@ 2501: OP fragt, ob der Zeiger als ein anderer Wert als der Wert "before" oder "after" gelesen werden kann. Was es nicht sein wird, angesichts all der Vorbehalte, die ich erwähnt habe. Ja, es könnte nachbestellt werden, aber es wird nicht beschädigt. –

+0

Ein atomarer Schreibvorgang wird als xchg auf x86 implementiert. Ich weiß ehrlich gesagt nicht, ob ein normaler Speicher mov ist (eine Last ist aber). – 2501

Verwandte Themen