编程范式15 笔记 并行化

来源:互联网 发布:odds ends相机数据 编辑:程序博客网 时间:2024/06/05 03:26

并行计算

假设有一个买票程序

int mian(){    int Agents=10;    int Tickets=150;    for(int i=1;i<=Agent;i++)    {        SellTicket(i,Agents,Tickets)    }}
void SellTickets(int i,int TicketsToSell){    while(TicketsToSell>0){        printf("%d sell a ticket\n",i)        TicketsToSell--;    }    printf("all done\n");}

并行化

int main(){    int Agents=10;    int Tickets=150;    InitThreadPackage(false);    for(int i=1;i<=Agent;i++)    {        char name[32];        sprintf(name,"%d sell thread",i);        ThreadNew(name,SellTickets,2,i,Tickets/Agent);    }    RunAllThreads();    return 0;}
void SellTickets(int i,int TicketsToSell){    while(TicketsToSell>0){        printf("%d sell a ticket\n",i)        TicketsToSell--;        if(RandomChance(0.1))            ThreadSleep(1000);            //0.1的概率暂停占用CPU            //不然还是按照顺序卖    }    printf("all done\n");}

使用指针共享临界区

int main(){    int Agents=10;    int Tickets=150;    InitThreadPackage(false);    for(int i=1;i<=Agent;i++)    {        char name[32];        sprintf(name,"%d sell thread",i);        ThreadNew(name,SellTickets,2,i,&Tickets/Agent);    }    RunAllThreads();    return 0;}
void SellTickets(int i,int *TicketsToSell){    while(*TicketsToSell>0){        printf("%d sell a ticket\n",i)        *TicketsToSell--;    }    printf("all done\n");}

信号量

int main(){    int Agents=10;    int Tickets=150;    Sempahore lock=SemaphoreNow(,1);    InitThreadPackage(false);    for(int i=1;i<=Agent;i++)    {        char name[32];        sprintf(name,"%d sell thread",i);        ThreadNew(name,SellTickets,2,i,&Tickets/Agent,lock);    }    RunAllThreads();    return 0;}
void SellTickets(int i,int *TicketsToSell){    while(true)    {        SemaphoreWait(lock);        if(*TicketsToSell==0) break;`    printf("%d sell a ticket\n",i)        *TicketsToSell--;        SemaphoreSignal(lock);    }    SemaphoreSignal(lock);}
原创粉丝点击