?
? ????? PHP ??? ???? ??? ?? ??
為C抽象機(jī)器的目的定義計(jì)算機(jī)內(nèi)存存儲(chǔ)的語(yǔ)義。
C程序可用的數(shù)據(jù)存儲(chǔ)(內(nèi)存)是一個(gè)或多個(gè)連續(xù)的字節(jié)序列。內(nèi)存中的每個(gè)字節(jié)都有一個(gè)唯一的地址。
字節(jié)是最小的可尋址內(nèi)存單元。它被定義為一個(gè)連續(xù)的位序列,足夠大以容納基本執(zhí)行字符集的任何成員(96個(gè)字符必須是單字節(jié))。C支持8位或更大的字節(jié)。
存儲(chǔ)和值表示的類(lèi)型char
,unsigned char
并signed char
使用一個(gè)字節(jié)。一個(gè)字節(jié)中的位數(shù)可以被訪問(wèn)為CHAR_BIT
。
存儲(chǔ)器位置是。
標(biāo)量類(lèi)型的對(duì)象(算術(shù)類(lèi)型,指針類(lèi)型,枚舉類(lèi)型)
或者是非零長(zhǎng)度的最大的連續(xù)比特字段序列
struct S { char a; // memory location #1 int b : 5; // memory location #2 int c : 11, // memory location #2 (continued) : 0, d : 8; // memory location #3 struct { int ee : 8; // memory location #4 } e;} obj; // The object 'obj' consists of 4 separate memory locations
線程和數(shù)據(jù)競(jìng)爭(zhēng)執(zhí)行線程是程序中的一個(gè)控制流程,以thrd_create或其他方式調(diào)用頂級(jí)函數(shù)開(kāi)始。任何線程都可能訪問(wèn)程序中的任何對(duì)象(具有自動(dòng)和線程本地存儲(chǔ)持續(xù)時(shí)間的對(duì)象仍然可以由另一個(gè)線程通過(guò)指針訪問(wèn))。不同的執(zhí)行線程總是被允許同時(shí)訪問(wèn)(讀取和修改)不同的內(nèi)存位置,不會(huì)產(chǎn)生干擾,也不需要同步。(注意,如果在它們之間聲明的所有成員也是(非零長(zhǎng)度)位字段,則同時(shí)更新同一結(jié)構(gòu)中的兩個(gè)非原子位字段是不安全的,不管這些介入位字段的大小如何,田野碰巧是)。當(dāng)表達(dá)式的評(píng)估寫(xiě)入內(nèi)存位置并且另一個(gè)評(píng)估讀取或修改相同的內(nèi)存位置時(shí),表達(dá)式被認(rèn)為是沖突的。有兩個(gè)相互沖突的評(píng)估的程序除了兩者之外還有數(shù)據(jù)競(jìng)爭(zhēng)。兩個(gè)沖突的評(píng)估都是原子操作沖突評(píng)估之一發(fā)生在另一個(gè)之前(請(qǐng)參閱memory_order)如果發(fā)生數(shù)據(jù)競(jìng)爭(zhēng),則程序的行為未定義。(特別是,mtx_unlock是與synchronized同步的,因此會(huì)在另一個(gè)線程的同一個(gè)互斥體的mtx_lock之前發(fā)生,這使得使用互斥鎖來(lái)防范數(shù)據(jù)爭(zhēng)奪成為可能)。內(nèi)存順序當(dāng)一個(gè)線程從一個(gè)線程讀取一個(gè)值內(nèi)存位置,它可能會(huì)看到初始值,寫(xiě)入同一線程的值或?qū)懭肓硪粋€(gè)線程的值。 | (自C11以來(lái)) |
---|
兩個(gè)相互沖突的評(píng)估都是原子操作
其中一個(gè)沖突評(píng)估發(fā)生在另一個(gè)之前(請(qǐng)參閱memory_order
)
如果發(fā)生數(shù)據(jù)競(jìng)爭(zhēng),程序的行為是未定義的。(特別mtx_unlock
是。
與另一個(gè)線程在同一個(gè)互斥體之前 mtx_lock
進(jìn)行同步并因此發(fā)生,這使得可以使用互斥鎖來(lái)防止數(shù)據(jù)競(jìng)爭(zhēng))內(nèi)存順序
當(dāng)線程從內(nèi)存位置讀取值時(shí),它可能會(huì)看到初始值,寫(xiě)入同一線程的值或?qū)懭肓硪粋€(gè)線程的值。請(qǐng)參閱有關(guān)memory_order
線程寫(xiě)入的順序?qū)ζ渌€程可見(jiàn)的詳細(xì)信息。
(since C11)
C11 standard (ISO/IEC 9899:2011):
3.6 byte (p: 4)
3.14 memory location (p: 5)
5.1.2.4 Multi-threaded executions and data races (p: 17-21)
C99 standard (ISO/IEC 9899:1999):
3.6 byte (p: 4)
C89/C90 standard (ISO/IEC 9899:1990):
1.6 DEFINITIONS OF TERMS