����ץ�����ߥ󥰡ʤ��Σ���
3.Memory Ordering
���󥰥�ץ����å��Υޥ������åɤǤϡ�volatile�ѿ���ե饰�ˤ��ƴ�ñ��Ʊ����񤯤��Ȥ��Ǥ��ޤ����� �㤨�С����Τ褦�ʴ����Ǥ����ʥ���ѥ����volatile�ѿ��ؤΥ��������ν���������ؤ��ʤ���ΤȤ��ޤ���
volatile int done = 0; volatile struct { int foo; int bar; } foobar; void writer(void) { foobar.foo = fizz(); foobar.bar = bazz(); done = 1; } void reader(void) { int foo, bar; while (!done) sleep(1); foo = foobar.foo; bar = foobar.bar; }
����ϡ��ޥ���ץ����å��Ķ��ǤϾ�꤯�����ʤ����Ȥ�����ޤ���������CPU�ϡ�̿�����֤˼¹Ԥ���Ȥϸ¤�ʤ�����Ǥ����㤨�С�����ñ¤¹ï¿½ï¿½ß¤ï¿½ï¿½ó¤·¤Ë¤ï¿½ï¿½ï¿½ï¿½ê¡¢ï¿½ï¿½ï¿½ï¿½ï¿½É¤ß¹ï¿½ï¿½ß¤ï¿½ï¿½êµ¡Åªï¿½Ë¡ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ã¤Æ¡Ë¼Â¹Ô¤ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½
�������ä����֤������ؤ��ϡ����Υץ����å�ñ�ΤǸ����Ȥ��ˤϥץ������μ¹Ԥ˱ƶ���̵���褦�ˤ���Ƥ��ޤ�����¾�Υץ����å����鸫���Ȥ��ˤϥ���ι���������ۤʤäƸ����Ƥ��ޤ��ޤ���
����������褹�뤿��ˡ�����ե��󥹤Ȥ������Ȥߤ�����ޤ����㤨�С�i686�Ǥ� lfence, sfence, mfence �Ȥ���̿�᤬����ޤ���lfence̿���ץ������ˤϤ���ȡ�lfence̿��������Load̿�᤬��lfence̿������˼¹Ԥ���뤳�Ȥ��ʤ��ʤ�ޤ���sfence̿���lfence̿��εդǡ�sfence̿��������Store����λ����(����å������ʤɤ˽ñ¤¹ï¿½ï¿½Þ¤ï¿½ï¿½)�Τ��Ԥ��ޤ���mfence̿���lfence��sfence��Â������ΤǤ���
��ۤɤΥץ������򡢥ޥ���ץ����å��Ǥ�ư���褦�˥���ե��󥹤���������ȡ����Τ褦�ˤʤ�ޤ���
volatile int done = 0; volatile struct { int foo; int bar; } foobar; void writer(void) { foobar.foo = fizz(); foobar.bar = bazz(); asm(" sfence;"); // foo��bar�νñ¤¹ï¿½ï¿½ß¤ï¿½ï¿½Î¼Â¤Ë¼Â¹Ô¤ï¿½ï¿½ï¿½ï¿½Î¤ï¿½ï¿½Ô¤ï¿½. done = 1; } void reader(void) { int foo, bar; while (!done) sleep(1); asm(" lfence;"); // done�����ˤʤ����ˡ�foo��bar��Load�����Τ��ɤ�. foo = foobar.foo; bar = foobar.bar; }
������󡢼�ʬ��Ʊ�����褦�Ȥ��ʤ���Ʊ��API��Ƥ٤С������ȥ���ե��󥹤⤷�Ƥ���ޤ��� �����ΰ������ϥǥХå����ɤ���褦�ʥ�ΤǤϤʤ������˥ǥХå����񤷤��Τǡ��ǽ餫��Ʊ��API�� ���Ѥ��뤳�Ȥ򤪴��ᤷ�ޤ���