[code]
EnterCriticalSection(&g_cs);
it = listUrl.begin();
...省略
listUrl.pop_front();
LeaveCriticalSection(&g_cs);
[/code]我是否可以把上面代码改成下面的[code]
EnterCriticalSection(&g_cs);
if(listUrl.empty())
{
LeaveCriticalSection(&g_cs);
return;
}
it = listUrl.begin();
...省略
listUrl.pop_front();
LeaveCriticalSection(&g_cs);
[/code]这样是否就可以解决listUrl为1的时候,多个线程取到一样的值,或者有没有别的办法

解决方案 »

  1.   

    EnterCriticalSection(&g_cs);
    it = listUrl.begin();
    data.ID = (*it).ID;
    ......................
    listUrl.pop_front();
    LeaveCriticalSection(&g_cs);上面的代码下面的代码 EnterCriticalSection(&g_cs);
    if(listUrl.empty())
    return;
    it = listUrl.begin();

    listUrl.pop_front();
    LeaveCriticalSection(&g_cs);listUrl为list<>类型
      

  2.   

    xxxxxxxxxxxxxxx编辑器竟然不支持火狐..............
      

  3.   

    应该先判断链表是否为空,否则data.ID   =   (*it).ID; 时会出错
    但这不能解决多个线程取到一样的值的问题
      

  4.   

    EnterCriticalSection(&g_cs); 
    if(listUrl.empty()) 
    return; 
    it   =   listUrl.begin(); 
     
    listUrl.pop_front(); 
    LeaveCriticalSection(&g_cs); 你的llistUrl.empty())并不空啊,还有一个值,所以还是跟上面的一样
    比较有效的方法是你用个数组,记录哪个值已经被取过了.
      

  5.   

    我前面已经判断了
    while(!listUrl.empty())
    {
    .................
    EnterCriticalSection(&g_cs);
    it   =   listUrl.begin();
    data.ID   =   (*it).ID;
    ......................
    listUrl.pop_front();
    LeaveCriticalSection(&g_cs); 是这样的,现在就是多线程的问题,2个线程同时进来,listUrl个数为1的时候,2个线程同时取到了一样的值
      

  6.   

    这个是个服务,有一个线程是不断往listurl写中数据的,用数组记录的话那就太大了啊。所以只能在EnterCriticalSection(&g_cs);再判断一次是否为空不是
    EnterCriticalSection(&g_cs);
    .............
    LeaveCriticalSection(&g_cs);
    中的内容只能同时一个线程进来吗?
      

  7.   

    EnterCriticalSection(&g_cs);  
    if(listUrl.empty())  
    return;   到底能不能这样用啊?还是要 ??????
    EnterCriticalSection(&g_cs);  
    if(listUrl.empty())  
    {
    LeaveCriticalSection(&g_cs); 
    return;   
    }还有没有别的方法?
      

  8.   

    EnterCriticalSection(&g_cs);
    if(!listUrl.empty()) {
    it   =   listUrl.begin();

    listUrl.pop_front();
    }
    LeaveCriticalSection(&g_cs); 
      

  9.   

    在LeaveCriticalSection(&g_cs);的后面还有代码呢,如果为空的话不想让他再往下运行了