首页
社区
课程
招聘
[旧帖] 关于#pragma comment(linker, "/Section:Shared,rws")的问题 0.00雪花
发表于: 2011-2-25 01:11 6550

[旧帖] 关于#pragma comment(linker, "/Section:Shared,rws")的问题 0.00雪花

2011-2-25 01:11
6550
遇到了非常奇怪的事情,我在DLL中设置了共享数据段,试图在多个进程中统计某种情况的次数,
#pragma data_seg("Shared")
int                                        g_nCount = 0;
#pragma data_seg()
#pragma comment(linker, "/Section:Shared,rws")

发现在某个进程中这个g_nCount 突然减少了2或3,比如现在是15,这个进程加载这个DLL时突然就变成了13。对g_nCount 的访问是有互斥量控制的。
        WaitForSingleObject(g_hMutex, INFINITE);
        int nIndex;
        nIndex = g_nCount;
        g_nCount++;
        char aaa[1024];
        sprintf(aaa,"获得mutex, index=%d\n",nIndex);
        OutputDebugString(aaa);
        ReleaseMutex(g_hMutex);
这里就发现突然比原先的值少2或3了。有人遇到过这种事情吗?怎么回事?

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
建议你把 g_hMutex 变量和g_nCount一样 也写到这个区段里 试试。
--------------------------------------------------------------------------
刚看了下核心编程 第8章
建议实用 InterelockedExchangeAdd 函数来进行++操作
另外 这个全局的整形变量要用 _aligned_malloc  要对齐方式(对齐粒度多少 他没讲) 申请sizeof(int)个空间来存储这个全局共享变量
2011-2-25 02:08
0
雪    币: 118
活跃值: (55)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
3
留上说的方法对呀,呵呵。
但是我想问下你那个互斥内核对象是跨进程全局的吗?如果不是的话 在进程间那还是无法同步的哦,如果是跨进程全局就使用楼生的所说的吧
2011-3-4 10:17
0
雪    币: 2105
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
HANDLE WINAPI CreateMutex(
  __in_opt  LPSECURITY_ATTRIBUTES lpMutexAttributes,
  __in      BOOL bInitialOwner,
  __in_opt  LPCTSTR lpName
);

Mutex有名字,这个名字是全局的,你可以在其他进程用这个名字打开来使用。

只是简单共享句柄的话是没用的,这个HANDLE只是一个Object INDEX而已,不同进程无法共享
2011-3-4 11:18
0
雪    币: 208
活跃值: (148)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
全局变量前面最好加上 volatile 关键字,
2011-3-4 11:40
0
游客
登录 | 注册 方可回帖
返回
//