On 24/10/17 00:52, Michael Niedermayer wrote: > Hi > > On Mon, Oct 23, 2017 at 04:43:19PM +0100, Mark Thompson wrote: >> On 23/10/17 03:56, Michael Niedermayer wrote: >>> the initialization should be thread safe as it never writes a different >>> value in the same spot >> >> This is not true; please be very careful with assumptions like this. >> >> The C standard calls this a data race and it is undefined behaviour. > > Thats interresting, we definitly do not want undefined behavior > can you quote the relevant parts of the C standard > which make writing the same value, a data race ? > > I was not aware of this if its true. > Also i dont immedeatly see this in the "latest" draft i am looking at > atm > > What i see is this: > 4 Two expression evaluations conflict if one of them modifies a memory > location and the > other one reads or modifies the same memory location. > ... > 25 The execution of a program contains a data race if it contains two > conflicting actions in > different threads, at least one of which is not atomic, and neither > happens before the > other. Any such data race results in undefined behavior. > > This seems carefully worded to not include writing the same value. > As "modification" implies change which does not occur when writing the > same value.
All writes are modifications. See section 3.1 note 2: """ 3 NOTE 2 "Modify" includes the case where the new value being stored is the same as the previous value. """ >> It is not just a theoretical concern, either - on architectures with >> destructive write-hint instructions ("fill cache line with unspecified data >> without loading it from memory, because I'm about to overwrite all of it", >> exactly what you want to use (and therefore the compiler will generate) to >> avoid pointless loads when overwriting a large table) other threads can and >> do see different contents transiently when the same data is written to the >> location. > > This might violate: > 27 NOTE 13 Compiler transformations that introduce assignments to a > potentially shared memory location > that would not be modified by the abstract machine are generally precluded > by this standard, since such an > assignment might overwrite another assignment by a different thread in > cases in which an abstract machine > execution would not have encountered a data race. This includes > implementations of data member > assignment that overwrite adjacent members in separate memory locations. > We also generally preclude > reordering of atomic loads in cases in which the atomics in question may > alias, since this may violate the > "visible sequence" rules. Yes, in order to match the behaviour of the abstract machine the transformation requires that the region in question is: * Not atomic: if atomic, another thread would be allowed to observe the intermediate state directly. * Overwritten entirely: if not overwritten entirely, other data would be touched which should not be, and that could be observed by another thread. * Without external ordering: if external synchronisation were present, another thread would be able to read values on one or other side of that boundary without a data race and observe an inconsistent state. The CRC table construction satisfies all of these conditions. Thanks, - Mark _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel