锘??xml version="1.0" encoding="utf-8" standalone="yes"?>久久免费视频6,久久久久亚洲精品无码网址,亚洲国产精品热久久http://cppblog.com/pwq1989/category/20753.htmlzh-cnTue, 19 Jan 2016 13:44:52 GMTTue, 19 Jan 2016 13:44:52 GMT60璁頒竴嬈emory Barrier鐩稿叧鐨勫皬鏍楀瓙http://m.shnenglu.com/pwq1989/archive/2016/01/19/212688.html鍙沖腑鍙沖腑Tue, 19 Jan 2016 08:13:00 GMThttp://m.shnenglu.com/pwq1989/archive/2016/01/19/212688.htmlhttp://m.shnenglu.com/pwq1989/comments/212688.htmlhttp://m.shnenglu.com/pwq1989/archive/2016/01/19/212688.html#Feedback0http://m.shnenglu.com/pwq1989/comments/commentRss/212688.htmlhttp://m.shnenglu.com/pwq1989/services/trackbacks/212688.html0x0

鍓嶄簺澶╃粍閲岃佸徃鏈篅姊佸笇鍦╦vm鐨勯」鐩Θ騫叉満鍣ㄦц兘涔嬩綑錛屼負浜嗘鏌ヤ笅gcc緙栬瘧鍣ㄥ拰Intel Xoen CPU鐨勬紜э紝鍐欎簡涓緇勬祴璇曚唬鐮佹祴璇曚簡涓媘fence鎸囦護鐨勬晥鏋?/p>

`
mfence Opcode : 0F AE /6

Performs a serializing operation on all load-from-memory and store-to-memory instructions that were issued prior the MFENCE instruction. This serializing operation guarantees that every load and store instruction that precedes in program order the MFENCE instruction is globally visible before any load or store instruction that follows the MFENCE instruction is globally visible. The MFENCE instruction is ordered with respect to all load and store instructions, other MFENCE instructions, any SFENCE and LFENCE instructions, and any serializing instructions (such as the CPUID instruction).
Weakly ordered memory types can be used to achieve higher processor performance through such techniques as out-of-order issue, speculative reads, write-combining, and write-collapsing.
The degree to which a consumer of data recognizes or knows that the data is weakly ordered varies among applications and may be unknown to the producer of this data. The MFENCE instruction provides a performance-efficient way of ensuring load and store ordering between routines that produce weakly-ordered results and routines that consume that data.
It should be noted that processors are free to speculatively fetch and cache data from system memory regions that are assigned a memory-type that permits speculative reads (that is, the WB, WC, and WT memory types). The PREFETCHh instruction is considered a hint to this speculative behavior. Because this speculative fetching can occur at any time and is not tied to instruction execution, the MFENCE instruction is not ordered with respect to PREFETCHh instructions or any other speculative fetching mechanism (that is, data could be speculatively loaded into the cache just before, during, or after the execution of an MFENCE instruction).
`

綆鍗曟潵璇村氨鏄竴涓彲浠ュ湪CPU涔卞簭鎵ц涓繚璇佺湡瀹炵殑load/store欏哄簭鐨勬寚浠?br />

0x1
鑰佸徃鏈哄啓浜嗕竴涓皬紼嬪簭(娉細鏈夎鐗?
// file: order.c

#define _GNU_SOURCE
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

union p64 {
    int i;
    char padding[64];
    long align8;
};

volatile union p64 v1, v2;
int b;

void *
run1(void *ignore)
{
    for (;;) {
        while (!b);
        if (v1.i || v2.i) {
            puts("assert error 1");
            exit(-1);
        }
        v1.i = 1;
        asm ("sfence": : :"memory");
        v2.i = 1;
        asm ("sfence": : :"memory");
        b = 0; 
    }
}

int
main()
{
    pthread_t p;
    pthread_create(&p, NULL, run1, NULL);
    int cnt = 0;

    for (;; cnt++) {
        v1.i = v2.i = 0;
        asm ("sfence": : :"memory");
        b = 1;
        asm ("sfence": : :"memory");
        int icnt = 0;
        for (;; icnt++) {
            int i1 = v1.i;
            asm ("lfence": : :"memory");
            int i2 = v2.i;
            if (i1 && i2)   break;
            if (i1 < i2) {
                printf("assert error, cnt = %d, icnt = %d, i1 = %d, i2 = %d\n", cnt, icnt, i1, i2);
                exit(-1);
            }
        }
    }
    return 0;
}

澶ф閫昏緫鏄細 涓鍏辨湁3涓彉閲忥紝v1.iv2.ib ,璧蜂簡2涓嚎紼嬶紝涓涓『搴忓啓鍏1鍜寁2錛屼竴涓v1鍜寁2錛屼簰鐩擱氳繃鏀瑰彉b鐨勫兼潵閫氳錛岀劧鍚庝袱涓嚎紼嬩笉鍋滃驚鐜?/p>

榪欎釜紼嬪簭浼氭寕鍦?br />printf("assert error, cnt = %d, icnt = %d, i1 = %d, i2 = %d\n", cnt, icnt, i1, i2); 
榪欐潯鏂█涓婏紝鎰忔濇槸綰跨▼1鍦ㄩ『搴忓啓鍏1鍜寁2錛屼絾鏄富綰跨▼鍗村嚭鐜拌鍒?v1=0錛寁2=1鐨勬儏鍐點?br />

0x2

鐒跺悗鎴戝府蹇欏幓鐪嬩簡涓涓嬶紝瑙夊緱榪欑鍐欐硶鐢氭槸綺楁毚錛屼簬鏄師鏍風収鎼簡涓涓猚++11鐗?

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#include <atomic>
#include <thread>

using namespace std;

union p64 {
    atomic<int> i;
    char padding[64];
    long align8;
};

volatile union p64 v1, v2;
atomic<int> b;

void *
run1()
{
    int rcnt = 0;
    for (;; rcnt++) {
        while (!b.load());
        if (v1.i.load() || v2.i.load()) {
            puts("assert error 1");
            exit(-1);
        }
        v1.i.store(1);
        v2.i.store(1);
        b.store(0);
    }
}

int
main()
{
    // init
    v1.i.store(0);
    v2.i.store(0);
    thread t(run1);
    int cnt = 0;
    for (;; cnt++) {
        v1.i.store(0);
        v2.i.store(0);
        b.store(1);
        int icnt = 0;
        for (;; icnt++) {
            int b2 = b.load();
            int i1 = v1.i.load();       // *****
            int i2 = v2.i.load();       // *****
            if (i1 && i2)   break;
            if (i1 < i2) {
                printf("assert error, cnt = %d, icnt = %d, i1 = %d, i2 = %d\n", cnt, icnt, i1, i2);
                exit(-1);
            }
            if (i1 == 0 && i2 == 0 && b2 == 0) break;
        }
    }
    return 0;
}

鍥犱負鏄師鏍風収鎼紝鎵浠ヨ偗瀹氳繕鏄細鎸傦紝浣嗘槸姣曠珶璇箟涓婃洿濂界悊瑙d簡

鎴戜滑鍏堟潵鍒嗘瀽涓涓嬩負浠涔堜細鎸?/p>

  • 綰跨▼1瀵逛簬v1錛寁2鐨勫啓鍏ラ『搴忎竴瀹氭槸涓鑷寸殑
  • Memory Barrier涔熶繚璇佷簡浠栦滑鍐欏叆欏哄簭瀵瑰叾浠栫嚎紼嬬殑鍙鎬э紙寰堟湁榪鋒儜鎬х殑涓鐐癸級
  • 浣嗘槸涓葷嚎紼嬪嵈鍙互璇誨埌 v1=0,v2=1鐨勬儏鍐?/li>
  • 鎵浠ユ儏鍐靛氨鏄櫧鐒墮『搴忓啓鍏ヤ簡錛屼絾鏄埆鐨勭嚎紼嬫病鏈夌湅鍒版紜殑欏哄簭錛?/li>
  • Intel: 騫朵笉鏄紒
  • 鍘熷洜鏄悶閿欎簡鍥犳灉鍏崇郴錛屼粬鐪熸淇濊瘉鐨勯『搴忔槸褰撲綘璇誨埌v2鐨刵ew value鐨勬椂鍊欙紝閭d箞v1涔熶竴瀹氳鍐欏叆浜嗐?/li>
  • 瑙e喅鏂規灝辨槸浜掓崲涓婇潰浠g爜涓垜鐢?*鏄熷彿**鏍囨敞鍑虹殑涓よ
  • done

鍦ㄦ棫鍐欐硶涓紝鎸傛帀鐨勬儏鍐墊槸綰跨▼1鍐欏叆v1 = 1錛屼富綰跨▼璇籿1錛屾病鏈夎鍒幫紝閭d箞涓葷嚎紼嬭涓簐1鏄?錛岀劧鍚庣嚎紼?緇х畫鍐欏叆v2錛屼富綰跨▼璇誨埌浜嗭紝涓葷嚎紼嬭涓簐2鏄?銆?鐒跺悗鎸傚湪浜嗘柇璦涓娿?/p>

涓よ浜掓崲鍚庯紝涓葷嚎紼嬮鍏堣鍙杤2錛屽鏋渧2宸茬粡鏄?浜嗭紝閭d箞v1涔熶竴瀹氭槸1錛屽弽涔嬩害鐒躲?/p>

0x3

褰撶劧錛屾兂璁╄窇閫氶偅涓緥瀛愪笉闇瑕侀偅涔堝鐨刟tomic<>錛岀簿綆涔嬪悗鍒╃敤c++11鐨刴emory_order鍙互鍐欐垚濡備笅錛?br />

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#include <atomic>
#include <thread>

using namespace std;

union p64 {
    int i;
    char padding[64];
    long align8;
};

volatile union p64 v1, v2;
atomic<int> b;    // variable b as a guard

void *
run1()
{
    int rcnt = 0;
    for (;; rcnt++) {
        while (!b.load());
        if (v1.i || v2.i) {
            puts("assert error 1");
            exit(-1);
        }
        v1.i = 1;
        v2.i = 1;
        b.store(0, memory_order_release);
    }
}
int
main()
{
    // init
    v1.i = 0;
    v2.i = 0;
    thread t(run1);
    int cnt = 0;

    for (;; cnt++) {
        v1.i = 0;
        v2.i = 0;
        b.store(1, memory_order_release);
        int icnt = 0;
        for (;; icnt++) {
            int b2 = b.load(memory_order_acquire);
            if (b2 != 0) {
                continue
            }
            int i1 = v1.i;
            int i2 = v2.i;
            if (i1 && i2)   break;
            if (i1 < i2) {
                printf("assert error 2, cnt = %d, icnt =  %d, i1 = %d, i2 = %d\n", cnt, icnt, i1, i2);
                exit(-1);
            }
        }
    }
    return 0;
}

鍒╃敤鍙橀噺b鍦ㄤ袱涓嚎紼嬩箣闂村悓姝ワ紝濡備笅鍥?br />

 (Thead 1)

   v1.i = 1;
   v2.i = 1;
   
   b.store(0, memory_order_release) <---+
                                                             |
                                                synchronize with b
                                                 (happend before)
                                                             |
                                                            +----->  b.load(memory_order_acquire)
                                                                          
                                                                        i1 = v1.i
                                                                        i2 = v2.i

                                                                       (Thread 2)

鎴戜滑鏌ョ湅涓嬬敓鎴愮殑浠g爜
g++ -std=c++11 -pthread -g -O2 order.cpp

 v1.i = 1;
  400be6:       c7 05 d0 10 20 00 01    movl   $0x1,0x2010d0(%rip)        # 601cc0 <v1>
  400bed:       00 00 00 
        v2.i = 1;
  400bf0:       c7 05 86 10 20 00 01    movl   $0x1,0x201086(%rip)        # 601c80 <v2>
  400bf7:       00 00 00 
        memory_order __b = __m & __memory_order_mask;
        __glibcxx_assert(__b != memory_order_acquire);
        __glibcxx_assert(__b != memory_order_acq_rel);
        __glibcxx_assert(__b != memory_order_consume);

        __atomic_store_n(&_M_i, __i, __m);
  400bfa:       c7 05 5c 10 20 00 00    movl   $0x0,0x20105c(%rip)        # 601c60 <b>
  400c01:       00 00 00 
        b.store(0, memory_order_release);

  

  400a58:       8b 05 02 12 20 00       mov    0x201202(%rip),%eax        # 601c60 <b>
            int b2 = b.load(memory_order_consume);
            if (b2 != 0) {
  400a5e:       85 c0                   test   %eax,%eax
  400a60:       75 f3                   jne    400a55 <main+0x55>
                continue
            }
            int i1 = v1.i;
  400a62:       8b 0d 58 12 20 00       mov    0x201258(%rip),%ecx        # 601cc0 <v1>
            int i2 = v2.i;
  400a68:       44 8b 05 11 12 20 00    mov    0x201211(%rip),%r8d        # 601c80 <v2>

鐪嬫潵Intel鐨凷trong Memory Model宸茬粡淇濊瘉浜嗚繖涓鐐癸紝Memory Barrier閮戒笉闇瑕佷簡

錛堣櫧鐒舵爣棰橀噷闈㈡湁MemoryBarrier錛屼絾鏄唴瀹歸噷闈㈡牴鏈病娑夊強鐨勬牱瀛愩傘傦級



鍙沖腑 2016-01-19 16:13 鍙戣〃璇勮
]]>
鍑芥暟寮忕紪紼嬭璦涓庡壇浣滅敤http://m.shnenglu.com/pwq1989/archive/2014/07/10/207540.html鍙沖腑鍙沖腑Thu, 10 Jul 2014 07:16:00 GMThttp://m.shnenglu.com/pwq1989/archive/2014/07/10/207540.htmlhttp://m.shnenglu.com/pwq1989/comments/207540.htmlhttp://m.shnenglu.com/pwq1989/archive/2014/07/10/207540.html#Feedback1http://m.shnenglu.com/pwq1989/comments/commentRss/207540.htmlhttp://m.shnenglu.com/pwq1989/services/trackbacks/207540.html

搴?/h3>

鍑芥暟寮忕紪紼嬭璦鏈夊緢澶氱瀹氫箟錛屽娉涚殑璁や負鏀寔楂橀樁鍑芥暟錛坔igher-order function錛夊氨綆楀嚱鏁板紡璇█鐨勮瘽錛屽ぇ澶氭暟鐜頒唬璇█閮芥槸鏀寔鍑芥暟寮忕紪紼嬬殑錛屼緥濡侰/C++錛宩ava錛孋#錛宭ua錛宲ython錛孞avaScript錛孲cala絳夌瓑銆傛敹绱т竴涓嬪畾涔夌殑璇濓紝鍔犲叆鍑芥暟寮忚璦瑕佹眰鐨勬ā寮忓尮閰嶃佹棤鍓綔鐢ㄧ瓑瑕佹眰錛岄偅涔堝墿涓嬬殑灝辨槸綰嚱鏁板紡璇█錛屾瘮杈冨父瑙佺殑鏈塇askell錛孋lean絳夈?/p>

鍓綔鐢ㄦ槸浠涔堝拰涓轟粈涔堟湁浜涜璦鎯沖湪璁捐涓婇伩鍏嶅壇浣滅敤榪欎釜闂錛実oogle鑳芥悳鍑哄ソ澶氬崥鏂囷紝榪欓噷灝變笉澶氳浜嗐傞伩鍏嶅壇浣滅敤鍙互甯︽潵涓浜涘疄闄呯殑濂藉錛屾瘮濡傚府浣犲ぇ閲忔敼鍐欎唬鐮佷粈涔堢殑錛堣錛夛紝鑰屼笖榪瀏cc閮芥湁 _ _ attribute _ _((pure/const))鐨勫嚱鏁版墿灞曞槢~銆傛瘮濡傚儚erlang榪欑渚濊禆浜庡壇浣滅敤緙栫▼鐨勮璦錛岃櫧鐒舵湁鐫鍙橀噺涓嶅彲鍙樿繖涓壒鎬э紝浣嗘槸浠嶇劧鍙互璇誨啓process鎼哄甫鐨勫叏灞鍙橀噺錛岃屼笖鍙堟病鏈変竴涓ソ鐨勭被鍨嬬郴緇燂紝鎵浠ュ湪緙栬瘧鐨勬椂鍊欎篃涓嶄細鎬庝箞澶ф敼浣犵殑浠g爜錛屽ぇ澶氳繕鏄洿璇戞垚瀛楄妭鐮併?/p>

娉細榪欑瘒鏂囩珷涓嶆槸**杞枃**錛屼笉浼氱敤涓猤(f(x))灝卞綋渚嬪瓙緇欏ぇ瀹惰鏃犲壇浣滅敤澶氫箞澶氫箞濂斤紝鍙紦瀛樼粨鏋滄媺(just a lie)~鍘熺敓鏀寔騫惰鎷?just another lie)錛岃繖浜涢兘鏄壇娣¤屼笖涓嶅疄闄呯殑銆傦紙鏈夋満浼氬啀鍐欎釜鍗氬涓撻棬璋堣皥榪欎釜錛?/p>

姝f枃

棣栧厛錛岀函鍑芥暟寮忕殑璇█寮鴻皟娌℃湁鍓綔鐢紝瀹冧笉浼氭敼鍙樹換浣曞疄闄呯殑涓滆タ錛屽綋鐒朵篃娌℃湁錛堝叏灞鐨勶級鐘舵侊紝榪欐牱鐨勭▼搴忓鏋滀笉閰嶄笂浠h〃鍓綔鐢ㄧ殑杈撳叆杈撳嚭褰撶劧鏄粈涔堥兘騫蹭笉浜嗙殑銆傞偅涔堝浣曟妸鍓綔鐢ㄥ祵鍏ュ埌鏈笉璇ユ湁鍓綔鐢ㄧ殑璇█璁捐涓偅錛熷綋鐒朵笉鑳界洿鎺ヨ祴鍊鹼紝涓嶇劧銆傘備笉鐒躲傘傚氨鍙樻垚鍛戒護寮忚璦浜嗭紝鑰屼笖鍑芥暟寮忚璦緙栬瘧涓紩浠ヤ負璞殑鍚勭浼樺寲pass鍑犱箮閮戒笉鑳界敤浜嗐傞偅涔堟妸鏈夊壇浣滅敤鐨勫嚱鏁版爣娉ㄥ嚭鏉ワ紵褰撶劧鏄竴涓姙娉曘傝繕鏈夊氨鏄妸鍓綔鐢ㄧ殑琛ㄨ揪寮忛兘鍖呭惈鍦╟ontext涓紝闅忕潃鍑芥暟浼犻掞紝淇濊瘉欏哄簭鑰屼笖瑕佷繚璇佸紩鐢ㄧ殑鍞竴鎬с?/p>

浣滀負綰嚱鏁板紡璇█鐨勪唬琛紝Haskell鍜孋lean瀵逛簬鍓綔鐢ㄧ殑璁捐瀹炵幇涓婂樊鍒緢澶э紝涓嬮潰灝辯畝鍗曡涓涓嬪畠浠殑瀹炵幇錛屽埁鏍圭┒搴曪紝鍏跺疄瀹冧滑鍋氱殑榪樻槸鍚屼竴浠朵簨鎯呫?/p>

haskell

Haskell涓湁涓涓緢閲嶈鐨勬蹇碉細Monad錛屽彇鍚嶈嚜鑼冪暣璁猴紝鍙互綺楁祬鐨勮涓哄畠灝辨槸瀹氫箟浜嗕竴緋誨垪鐨勮涓哄噯鍒欙紙>>= , return錛夈侶askell涓ぇ澶氭暟璇硶緋栭兘鏄負浜嗚繖涓彂鏄庢潵鐨勩侶askell鐨勬爣鍑嗗簱涓湁寰堝鍏充簬鍓綔鐢ㄧ殑綾誨簱灝佽錛屾瘮濡侷ORef錛孧Var錛孖OMonad絳夌瓑錛屼粬浠殑鍐呴儴瀹炵幇閮戒細褰掔粨鍒癝T Monad錛圫tate Thread Monad錛変笂錛屾鏄繖涓笌forall鍏抽敭瀛楃殑緇撳悎錛屼粠鑰屽湪璇硶涓婁繚璇佷簡鍓綔鐢ㄥ祵鍏ュ湪錛堢函錛塇askell涓殑姝g‘鎬с?br style="box-sizing: border-box;" />ST Monad閲岄潰涓昏鐨勫畾涔夋槸錛?/p>

 newtype ST s a = ST (STRep s a)
 type STRep s a = State# s -> (# State# s, a #)
 data STRef s a = STRef (MutVar# s a)

 runST :: (forall s. ST s a) -> a
 runSTRep :: (forall s. STRep s a) -> a

鍏朵腑鏈鍏抽敭鐨勬槸ST s a 涓?STref s a 榪欎袱涓暟鎹粨鏋勩?/p>

鍏堢湅鐪嬭繖涓敤娉曪紝let a0 = runST $ newSTRef 0錛屼細寮曞彂涓涓猼ype error銆傚洜涓簉unST鐨勭被鍨嬫槸(forall s.ST s a) -> a 錛屽弬鏁?code style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 14.5454540252686px; padding: 2px 4px; color: #c7254e; white-space: nowrap; border-radius: 2px; background-color: #f9f2f4;">(newSTRef 0)鐨勭被鍨嬫槸forall s. ST s (STRef s Int)錛屾渶鍚庢眰鍊煎悗鐨勭粨鏋滄槸a0::STRef s Int錛屾樉鐒秙鑴辯浜嗗師鏈殑瀹氫箟鍩燂紙涔熷氨鏄偅灞俧orall涔嬪錛宖orall鏄疕askell涓彁渚?*RankNType**鐨勫叧閿瓧錛夈備粠鑰岀敤鎴峰氨鍙兘浣跨敤涓嬮潰鐨勬柟寮忥細

sumST :: Num a => [a] -> a
sumST xs = runST $ do          
    n <- newSTRef 0             
    forM_ xs $ \x -> do        
    modifySTRef n (+x)     
    readSTRef n     

涓嶇敤鏍囧嚭鏍囧嚭鍏蜂綋瀹炵幇錛屽ぇ瀹跺氨鑳界湅鍑轟粬鍋氱殑浜嬫儏灝辨槸鍋氫簡涓灞倃rapper錛屽湪type checker涓婁繚璇佽box涔嬪悗涓嶄細琚敤鎴峰彇鍑烘潵涔辨敼銆傝嚦浜庡浣曞仛鍒癲estructive in-place update錛岃繖灝卞睘浜庣紪璇戝櫒鐨勯粦欖旀硶浜嗭紝璇█榪欏眰鍙渶淇濊瘉璇箟灝卞ソ銆傦紙**娉細**ghc鐨勫疄鐜頒腑錛孲T Monad鏍囧噯搴撶敤鍒頒簡ghc鐨剈nsafe鎵撳ご鐨勫唴緗嚱鏁幫級

Clean

Clean璇█鐢ㄧ殑絳栫暐鏄嚎鎬х被鍨嬬郴緇燂紙linear type system錛夛紝鏄疭ubstructural type sysytem鐨勪竴縐嶃傚湪Curry-Howard鍚屾瀯涓搴擲ubstructrual logic銆傝繖綾葷被鍨嬬郴緇熶腑錛屼笉浣嗗彲浠ュ喅瀹氫竴涓彉閲忔槸浠涔堢被鍨嬶紝榪樺彲浠ョ害鏉熻浣跨敤鐨勬鏁頒笌欏哄簭銆傚湪Mozilla鍑虹殑Rust璇█涓紝涔熷彲浠ョ湅鍒扮嚎鎬х被鍨嬬殑褰卞瓙銆?/p>

鍏堜婦涓牀瀛悀

transform :: (Int -> Int) *{#Int} -> *{#Int} 
transform f s | size s == 0 = s | otherwise = if (s.[0] == 0) {f i \\ i <-: s} {f i \\ _ <-: s & i <- [s.[0]..]}

錛堜笉瑕佸湪鎰忓鎬殑璇硶錛岋經锝濋噷闈㈠叾瀹炲氨鏄痩ist comprehension錛?/p>

鍏朵腑*灝辨槸uniqueness type鐨勬爣娉紝榪欎釜鍑芥暟鐨勭被鍨嬬敤haskell鍐欏嚭鏉ュ氨鏄?code style="box-sizing: border-box; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 14.5454540252686px; padding: 2px 4px; color: #c7254e; white-space: nowrap; border-radius: 2px; background-color: #f9f2f4;">transform :: (Int -> Int) -> *[Int] -> *[Int]銆傝繖涓嚱鏁拌櫧鐒舵病鏈夊緢濂界殑鐪嬪嚭uniqueness type鐨勭壒鎬у拰浼犳挱鎬э紝浣嗘槸浣滀負綆鍗曠殑渚嬪瓙錛屽樊涓嶅灝辨槸榪欎箞鍥炰簨銆?br style="box-sizing: border-box;" />瀵逛簬uniqueness type鏈鐩磋鐨勭悊瑙e氨鏄甫鏈夎繖涓爣璇嗙殑綾誨瀷鏄笉鑳藉弬涓庡埌浠ュ悗Graph Reduction涓紝鑰屼笖浼氭嫻嬩細涓嶄細鏈夊涓?#8220;鍙橀噺”鎸囧悜浠栥備笂闈㈣繖涓嚱鏁頒腑灝變笉浼氬瓨鍦ㄥ涓猍Int]鍙婄浉鍏崇殑鍓湰絳夌潃琚洖鏀訛紝鑰屾槸浼氱洿鎺ュ湪錛圧eadWorld涓殑錛夊唴瀛樹笂鏇存柊鏁版嵁銆?/p>

鏈鍚?/h3>

鍏跺疄宸茬粡鐪嬪嚭錛屽湪涓婇潰Haskell涓嶤lean鐨勫仛娉曚腑錛屼竴涓槸鍒╃敤forall鍏抽敭瀛椾笌ST Monad+緙栬瘧鍣ㄩ粦欖旀硶錛屽彟涓涓槸build-in鍦ㄧ被鍨嬬郴緇熶腑錛屼絾鏄湰璐ㄩ兘鏄仛浜嗕竴浠朵簨鎯咃紝灝辨槸淇濊瘉RealWorld涓殑瀵硅薄涓嶄細瀛樺湪澶氫釜寮曠敤錛岃屼笖鍦℅raph Reduction涓笉浼氳緙栬瘧鍣ㄦ悶涔遍『搴忥紝榪欐牱灝辮兘铻嶅叆鍒版暣涓函鍑芥暟寮忕殑澶т綋緋諱腑浜嗐?/p>
鏈漢鍗氬鍦板潃錛坔ttp://m.shnenglu.com/pwq1989/錛?br />

鍙沖腑 2014-07-10 15:16 鍙戣〃璇勮
]]>綾誨瀷緋葷粺涓庡浘鐏靛畬鍏?/title><link>http://m.shnenglu.com/pwq1989/archive/2014/07/10/207536.html</link><dc:creator>鍙沖腑</dc:creator><author>鍙沖腑</author><pubDate>Thu, 10 Jul 2014 07:14:00 GMT</pubDate><guid>http://m.shnenglu.com/pwq1989/archive/2014/07/10/207536.html</guid><wfw:comment>http://m.shnenglu.com/pwq1989/comments/207536.html</wfw:comment><comments>http://m.shnenglu.com/pwq1989/archive/2014/07/10/207536.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://m.shnenglu.com/pwq1989/comments/commentRss/207536.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/pwq1989/services/trackbacks/207536.html</trackback:ping><description><![CDATA[     鎽樿: 搴忕被鍨嬬郴緇熷湪緙栫▼璇█涓槸鏋佷負閲嶈錛屼笉鍗曞崟鏄彁渚涗竴涓被鍨嬬殑鏍囨敞鎴栨槸鏂逛究緙栬瘧錛屾洿澶氭椂鍊欐槸鍑忓皯鍑洪敊鐨勫彲鑳姐傚綋綾誨瀷緋葷粺寮哄ぇ鍒頒竴瀹氱▼搴︼紝灝卞彲浠ヨ繘琛屾墍璋撶殑“瀵岀被鍨嬬紪紼?#8221;錛屾瘮濡傚湪Haskell涓彧瑕佺紪璇戝櫒涓嶆姤閿欙紝澶ц嚧涓婄▼搴忎篃鏄病浠涔坆ug鐨勩傚湪甯哥敤鐨勯潤鎬佺被鍨嬭璦涓紝C++/java/C#絳夛紝铏界劧鍦ㄦ柊鏍囧噯涓庢柊鐗堟湰涓敮鎸佺被鍨嬬殑鑷姩鎺ㄥ錛屼絾鏄綾誨瀷緋葷粺鍙婂叾鎺ㄥ榪樻槸緙哄皯鏇翠負鐩存帴鐨勬敮鎸併傚緢澶氬父鐢ㄨ...  <a href='http://m.shnenglu.com/pwq1989/archive/2014/07/10/207536.html'>闃呰鍏ㄦ枃</a><img src ="http://m.shnenglu.com/pwq1989/aggbug/207536.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/pwq1989/" target="_blank">鍙沖腑</a> 2014-07-10 15:14 <a href="http://m.shnenglu.com/pwq1989/archive/2014/07/10/207536.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>Haskell鍒壄鐨刌-Combinatorhttp://m.shnenglu.com/pwq1989/archive/2014/02/27/205964.html鍙沖腑鍙沖腑Wed, 26 Feb 2014 16:25:00 GMThttp://m.shnenglu.com/pwq1989/archive/2014/02/27/205964.htmlhttp://m.shnenglu.com/pwq1989/comments/205964.htmlhttp://m.shnenglu.com/pwq1989/archive/2014/02/27/205964.html#Feedback5http://m.shnenglu.com/pwq1989/comments/commentRss/205964.htmlhttp://m.shnenglu.com/pwq1989/services/trackbacks/205964.html
鏄ㄥぉ鍦ㄧ煡涔庝笂鐪嬪埌涓涓瘎璁烘彁鍒頒簡Haskell鐨刌C瀹炵幇錛屽氨鍘繪悳浜嗕竴涓嬶紝鐒跺悗灝辯湅鍒頒簡涓涓疄鐜幫細
1 newtype Mu a = Mu (Mu a -> a)
2 
3 y :: (a -> a) -> a
4 y f = (\h -> h $ Mu h) (\x -> f . (\(Mu g) -> g) x $ x)

鍡紝鐪熸槸鍒壄

鍙嶈涓涓嬪叾浠栬璦鐨刌C鍐欐硶錛屽氨璐翠竴涓猯ua鐨勬妸
1 Y = function (f)
2    return function()
3       return (function(x) return x(x) end)
                   (function(x) return f(function(y) return x(x)(y) end) end)()
4    end
5 end
铏界劧鐪嬭搗鏉ュ緢闀匡紝浣嗘槸瀹規槗鐞嗚В鐨勫錛岀敤λ琛ㄨ揪寮忓啓鍑烘潵灝辨槸錛?a target="_blank" title="wiki">wiki錛?br />λf. (λx. f (x x)) (λx. f (x x))
鐩殑灝辨槸鑳藉仛鍑?Y f = f (Y f) 榪欑鏁堟灉錛屼箣鎵浠ヨ繖涔堝啓錛屾槸涓轟簡涓嶅紩鍏ュ悕瀛楋紙寮曞叆浜嗗悕瀛楁槸鎭?錛?br />
瀵逛簬Haskell榪欑鐢℉M綾誨瀷緋葷粺鐨勮璦鏉ヨ錛屾渶澶х殑闂灝辨槸涓嶈兘閫掑綊鐨勫畾涔夌被鍨嬶紝鍚屾牱鏄潤鎬佺被鍨嬫鏌ワ紝姣斿C#錛屽氨鍙互涓嶈垂鍔涚殑鐢‵unc鍜宒elegate鍋氬嚭鏉ワ紝haskell 棰濓紝灝卞緱鎵洸鐨勫埄鐢╪ewtype Mu a = Mu (Mu a -> a) 鏉ョ粫榪囩被鍨嬫鏌ワ紙褰撶劧錛岃繖涓湪Haskell涓槸涓嶅彲鑳芥瀯閫犲嚭涓涓疄闄呯殑鍊肩殑錛夈?br />
鐪嬩笅浠栨槸鎬庝箞鍋氱殑錛屾垜浠潵鎶婁粬灞曞紑涓涓嬶細
鍘熷紡瀛愶細y f = (\h -> h $ Mu h) (\x -> f . (\(Mu g) -> g) x $ x)
甯﹁繘鍘伙細y f = (\x -> f . (\(Mu g) -> g) x $ x) $ Mu (\x -> f . (\(Mu g) -> g) x $ x)
鍐嶆潵涓閬嶏細y f = f . (\x -> f . (\(Mu g) -> g) x $ x) $ Mu (\x -> f . (\(Mu g) -> g) x $ x)

榪欐牱瀛愶紝鏈鍚庨偅涓紡瀛愮殑f. 鍚庨潰鐨勯偅閮ㄥ垎錛屾彁鍙?nbsp;(\x -> f . (\(Mu g) -> g) x $ x) 榪欎釜鍏洜寮?灝辯浉褰撲簬鏄?\h -> h $ Mu h) (\x -> f . (\(Mu g) -> g) x $ x)浜嗭紙寰堝儚鏁板鎶婏紝浣嗕篃娌″澶у叧緋伙級
鏈鍚庯紝灝卞彲浠ュ仛鍑簓 f = f . (y f)浜嗐?br />
鍏跺疄榪欎釜鍐欐硶鏈鍏抽敭鐨勬槸 newtype Mu a = Mu (Mu a -> a)鐨勪綔鐢紝浠栨槸濡備綍緇曡繃綾誨瀷媯鏌ワ紝浣嗘槸鍙堜笉鍦ㄨ繍琛屾湡鏋勯犱竴涓鹼紙鎯蟲瀯閫犱篃鏋勯犱笉鍑烘潵錛夈?br />
鏉ョ湅涓嬩粬鐨勭被鍨嬫帹瀵艱繃紼嬶紝y鐨勭被鍨嬫槸y :: (a -> a) -> a錛屾墍浠ラ噷闈灝辨槸 f :: a -> a錛屾墍浠 . (\(Mu g) -> g) x $ x 榪欎釜寮忓瓙鍙互鎺ㄥ嚭閲岄潰鐨剎鏄?x :: Mu a 鐒跺悗(\(Mu g) -> g) x 鍙栧嚭閲岄潰鐨?a錛岃繖鏍峰氨鎴愪簡
f a $ Mu a錛岃繖鏃跺橫u a = Mu (Mu a -> a) 閫掑綊瀹氫箟鐨勪綔鐢ㄥ氨鍙戞尌浜嗭紝涓轟簡綾誨瀷鐨勬帹瀵鹼紝緇х畫灝嗛偅涓孩鑹茬殑a 鎺ㄥ鎴?Mu a -> a錛岃繖鏍?f (Mu a -> a) 浼氳繑鍥炰竴涓狹u a -> a錛岀浠栧彨f'鎶婏紝榪欐牱 f' (Mu a) 灝辮繑鍥炰竴涓?a銆傛湁鏍規嵁鍓嶉潰鐨?\h -> h $ Mu h) 緇х畫璁蹭笂闈㈡彁鍒扮殑a鍙樻垚 Mu a -> a銆傚氨鏄妸Mu a 鍠傜粰浜?(Mu a -> a)錛屾渶鍚庤繕鏄繑鍥炰竴涓猘銆?br />(>_< 鍏跺疄涓婇潰榪欐鏄垜緙栧嚭鏉ョ殑錛屾垜緙栦笉涓嬪幓浜嗭紝鎴戜笉鐭ラ亾ghc鏄庝箞鍋氳繖涓簨鎯呯殑錛岀瓑鎴戞湁鐢熶箣騫寸湅瀹宻lpj-book-1987鍐嶆兂鎯?

鎴戜滑鏉ュ簲鐢ㄤ竴涓嬶紝榪斿洖涓涓樁涔橈細
y (\f n -> if n <= 1 then 1 else n * f (n - 1)) 5銆?
涓嶉毦鐪嬪嚭錛屾渶緇坹鐨勭被鍨嬭鐗瑰寲鎴愪簡 ((Int -> Int) -> (Int -> Int)) -> (Int -> Int)


鍙沖腑 2014-02-27 00:25 鍙戣〃璇勮
]]>
C++ 涔?Memory Barrier http://m.shnenglu.com/pwq1989/archive/2014/01/08/205228.html鍙沖腑鍙沖腑Tue, 07 Jan 2014 16:54:00 GMThttp://m.shnenglu.com/pwq1989/archive/2014/01/08/205228.htmlhttp://m.shnenglu.com/pwq1989/comments/205228.htmlhttp://m.shnenglu.com/pwq1989/archive/2014/01/08/205228.html#Feedback0http://m.shnenglu.com/pwq1989/comments/commentRss/205228.htmlhttp://m.shnenglu.com/pwq1989/services/trackbacks/205228.htmlhttp://m.shnenglu.com/pwq1989/ 


浠婂ぉ緹ら噷濮愬か鎺ㄨ崘浜嗕釜C++鐨凙ctor妗嗘灦 Theron錛屽氨鐪嬩簡涓嬫簮鐮侊紝娉ㄩ噴姣斾唬鐮佽繕澶氾紝涓氱晫鑹績銆?br />
婧愮爜鎴戣繕娌$湅瀹岋紝灝辯湅鍒頒簡浠栫殑涓涓彨StringPool鐨勭被錛岄噷闈㈤氳繃Ref鏉ョ敓鎴愬崟渚嬶紙Singleton錛夛紝鐪嬩簡涓?br />
static void Reference();榪欎釜鍑芥暟瀹炵幇鐨勬椂鍊欙紝紿佺劧鑴戞礊涓寮錛屼負鍟ユ病鏈塎emory Barrier(wiki)銆?br />
鍏堣創涓涓嬩粬鐨勪唬鐮侊細
 1 StringPool *StringPool::smInstance = 0;
 2 Mutex StringPool::smReferenceMutex;
 3 uint32_t StringPool::smReferenceCount = 0;
 4 
 5 
 6 void StringPool::Reference()
 7 {
 8     Lock lock(smReferenceMutex);
 9 
10     // Create the singleton instance if this is the first reference.
11     if (smReferenceCount++ == 0)
12     {
13         IAllocator *const allocator(AllocatorManager::GetCache());
14         void *const memory(allocator->AllocateAligned(sizeof(StringPool), THERON_CACHELINE_ALIGNMENT));
15         smInstance = new (memory) StringPool();
16     }
17 }

鎴戜滑鍏堜笉璁ㄨ榪欎竴孌典唬鐮侊紝鍏堢湅鐪嬩笅闈㈢殑錛?br />
澶у濡傛灉鐪嬭繃C++鐨凞ouble Check Lock涓嶅彲闈犵殑榪欑瘒paper(鍦板潃)錛屼綔鑰呯粰鍑虹殑瑙e喅鏂規鏄繖鏍風殑錛?br />
 1     // First check
 2     TYPE* tmp = instance_;
 3     // Insert the CPU-specific memory barrier instruction
 4     // to synchronize the cache lines on multi-processor.
 5     asm ("memoryBarrier");
 6     if (tmp == 0) {
 7         // Ensure serialization (guard
 8         // constructor acquires lock_).
 9         Guard<LOCK> guard (lock_);
10         // Double check.
11         tmp = instance_;
12         if (tmp == 0) {
13                 tmp = new TYPE;
14                 // Insert the CPU-specific memory barrier instruction
15                 // to synchronize the cache lines on multi-processor.
16                 asm ("memoryBarrier");
17                 instance_ = tmp;
18         }
19     return tmp;

鍏跺疄榪欎袱涓狹emory Barrier涓嶇敤鍏ㄥ睆闅滐紝絎竴涓敤璇誨睆闅渞mb()灝卞ソ浜嗐傜浜屼釜闇瑕佷竴涓啓灞忛殰wmb()銆?br />
鎴戜滑閮界煡閬搈b榪欎釜涓滆タ鏄負浜嗛槻姝PU綰у埆鐨勬寚浠や貢搴忚鍙戞槑鍑烘潵鐨勶紝錛堝彟涓涓槸緙栬瘧鍣ㄧ駭鍒殑錛屽拰鏈瘒鏂囩珷娌℃湁澶氬ぇ鍏崇郴錛屾湁鍏磋叮澶у鍙互鍘葷爺絀朵笅錛夛紝瀹炵幇涔熸槸鐢卞鉤鍙扮浉鍏崇殑鐗規畩鎸囦護(mfence榪欐牱鐨?緇勬垚鐨勩?br />
涔嬫墍浠ヨ鍐欐垚榪欐牱錛岀浜屼釜mb()鏄負浜嗛槻姝㈠湪鏋勯犲嚱鏁板畬鎴愪箣鍓嶆彁鍓嶅鐩爣璧嬪鹼紝浣哻tor榪樻病瀹屾垚錛屽氨琚寕璧鳳紝鐒跺悗絎簩涓嚎紼嬭闂殑鏃跺欙紝璁や負宸茬粡鏋勯犲畬姣曪紝榪涜屼嬌鐢ㄤ笉瀹屾暣鐨勬暟鎹紩鍙戝鎬殑閿欒銆?br />
(絎竴涓猺mb()鐨勪綔鐢ㄦ垜瑙夊緱鏄彲鏈夊彲鏃狅紝鍔犱笂鍙兘鏄負浜嗘晥鐜囨妸錛堢寽錛夛紝寮哄埗鍒鋒柊璇誨彇instance_鐨勫鹼紝闃叉榪涘叆絎竴涓猚heck鍘葷珵浜夐偅涓攣錛屼笉鍔犱篃鏄笉浼氭湁閿欑殑錛屽洜涓篜OSIX瑙勫畾mutex涔嬮棿蹇呴』淇濇寔鍐呭瓨鐨勫彲瑙佹э紝鎵浠ユ槸涓嶉渶瑕佹媴蹇冭鍒拌剰鏁版嵁) <-- 榪欐鏄釜浜烘剰瑙侊紝嬈㈣繋淇銆?br />
涓嬮潰灝辨槸鎴戣洞浜嗗崐涓嬪崍鎵嶆兂鏄庣櫧鐨勯棶棰樸傘傘備負鍟heron涓偅孌典唬鐮侊紙絎竴孌典唬鐮侊級涓嶉渶瑕佸湪lock涓坊鍔爉b()錛屽悗鏉ュ線涓嬬炕浜嗕笅錛屽彂鐜癝tringPool鐨勬瀯閫犲嚱鏁版槸絀虹殑銆傘傛牴鏈氨娌℃湁鍐呭瓨鐨勫啓鍏ワ紝褰撶劧灝變笉闇瑕亀mb()浜嗐?br />

鍙錛孋++鐨勫綰跨▼緙栫▼錛屽ソ闅?br />

鍙沖腑 2014-01-08 00:54 鍙戣〃璇勮
]]>
婷婷久久香蕉五月综合加勒比 | 久久无码人妻精品一区二区三区| 狠狠色丁香婷综合久久| 色婷婷综合久久久久中文| 成人国内精品久久久久一区| 国产精品综合久久第一页 | 久久亚洲AV成人无码软件| 久久99热这里只有精品国产| 女人香蕉久久**毛片精品| 日本精品久久久久影院日本| 久久亚洲欧美国产精品| 精品久久久久久无码人妻热| 久久久国产99久久国产一| 国产精品久久久久久久| 久久中文字幕人妻丝袜| 久久97久久97精品免视看| 国产aⅴ激情无码久久| 久久免费观看视频| 97热久久免费频精品99| 久久这里的只有是精品23| 9191精品国产免费久久| 色婷婷综合久久久久中文 | 国产精品嫩草影院久久| 国内精品九九久久久精品| 亚洲欧洲久久久精品| 成人精品一区二区久久久| 国产∨亚洲V天堂无码久久久| 亚洲国产成人久久精品99 | 国产精品一区二区久久不卡| 日本五月天婷久久网站| 久久国产精品波多野结衣AV| 热久久国产精品| 久久亚洲精品中文字幕三区| 99国产欧美精品久久久蜜芽| 久久A级毛片免费观看| 久久久久高潮毛片免费全部播放| 久久精品免费全国观看国产| 日韩中文久久| 久久婷婷午色综合夜啪| 久久久SS麻豆欧美国产日韩| 亚洲?V乱码久久精品蜜桃|