本站首页    管理页面    写新日志    退出


«April 2019»
123456
78910111213
14151617181920
21222324252627
282930


公告

戒除浮躁,读好书,交益友


我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:邢红瑞的blog
日志总数:523
评论数量:1142
留言数量:0
访问次数:9243847
建立时间:2004年12月20日




[c++]windows的c++并发编程
原创空间,  文章收藏,  网上资源,  软件技术,  电脑与网络

邢红瑞 发表于 2011-3-15 17:50:21

“以无锁为有锁,以无限为有限,此乃多核编程的最高境界”,无锁就是lock free,某些线程可以有限步执行完,尽管任何一个线程都可能饥饿。有限就是说wait free任何线程都在有限步内完成,不会出现饥饿的情况。wait free 是多核编程的顶峰,大多数wait free 都是针对java的,现在贴一段msdn的代码。 #include <windows.h>#include <malloc.h>#include <stdio.h> // Structure to be used for a list item; the first member is the // SLIST_ENTRY structure, and additional members are used for data.// Here, the data is simply a signature for testing purposes. typedef struct _PROGRAM_ITEM {    SLIST_ENTRY ItemEntry;    ULONG Signature; } PROGRAM_ITEM, *PPROGRAM_ITEM; int main( ){    ULONG Count;    PSLIST_ENTRY pFirstEntry, pListEntry;    PSLIST_HEADER pListHead;    PPROGRAM_ITEM pProgramItem;     // Initialize the list header to a MEMORY_ALLOCATION_ALIGNMENT boundary.    pListHead = (PSLIST_HEADER)_aligned_malloc(sizeof(SLIST_HEADER),       MEMORY_ALLOCATION_ALIGNMENT);    if( NULL == pListHead )    {        printf("Memory allocation failed.\n");        return -1;    }    InitializeSListHead(pListHead);     // Insert 10 items into the list.    for( Count = 1; Count <= 10; Count += 1 )    {        pProgramItem = (PPROGRAM_ITEM)_aligned_malloc(sizeof(PROGRAM_ITEM),            MEMORY_ALLOCATION_ALIGNMENT);        if( NULL == pProgramItem )        {            printf("Memory allocation failed.\n");            return -1;        }        pProgramItem->Signature = Count;        pFirstEntry = InterlockedPushEntrySList(pListHead,                        &(pProgramItem->ItemEntry));     }     // Remove 10 items from the list and display the signature.    for( Count = 10; Count >= 1; Count -= 1 )    {        pListEntry = InterlockedPopEntrySList(pListHead);         if( NULL == pListEntry )        {            printf("List is empty.\n");            return -1;        }          pProgramItem = (PPROGRAM_ITEM)pListEntry;        printf("Signature is %d\n", pProgramItem->Signature);     // This example assumes that the SLIST_ENTRY structure is the     // first member of the structure. If your structure does not     // follow this convention, you must compute the starting address     // of the structure before calling the free function.         _aligned_free(pListEntry);    }     // Flush the list and verify that the items are gone.    pListEntry = InterlockedFlushSList(pListHead);    pFirstEntry = InterlockedPopEntrySList(pListHead);    if (pFirstEntry != NULL)    {        printf("Error: List is not empty.\n");        return -1;    }     _aligned_free(pListHead);     return 1;}


阅读全文(5264) | 回复(-2) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.031 second(s), page refreshed 144255954 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号