stl map同时编写示例代码

时间:2012-07-20 19:43:05

标签: c++ multithreading

我想在同时写入条件下模拟stl映射的异常行为。 这里我使用单个映射并同时从多个线程插入数据。 因为我们只使用一个地图对象,所以它不应该允许。 请仔细阅读以下示例代码

    #include <iostream>
    #include <map>
    #include <iterator>
    #include <algorithm>

    extern "C"
    {
    #include <pthread.h>
    #include <string.h>
    #include <stdlib.h>
    }

    using namespace std;

//functor to print map
    struct PrintMp
    {
       void operator()(pair<int,int> pr)
       {
          cout<<pr.first<<" => "<<pr.second<<endl;
       }
    };
//thread 1
//inserts continuous no from 0 to 4999    
    void* ins_th1(void *arg)
    {
       map<int, int> *mp = static_cast<map<int, int>* >(arg);
       for(int i =0 ; i<5000; i++)
          mp->insert(pair<int,int>(i, i+1000));

       return NULL;
    }

//thread 1
//inserts continuous no from 0 to 4999    
    void* ins_th2(void *arg)
    {
       map<int, int> *mp = static_cast<map<int,int>* >(arg);
       for(int i=5000; i<10000; i++)
          mp->insert(pair<int, int>(i, i+2000));
       return NULL;
    }


    int main()
    {
       typedef map<int, int> IntMapType;

       IntMapType mp;
       PrintMp MpPrintObj;
       int rc;

       pthread_t th1, th2;
    //thread 1 creation
       rc = pthread_create(&th1, NULL, ins_th1, static_cast<void*>(&mp));
       if ( rc != 0)
       {
          cerr<<strerror(rc)<<"in thread1"<<endl;
          exit(EXIT_FAILURE);
       }
    //thread 2 creation
       rc = pthread_create(&th2, NULL, ins_th2, static_cast<void*>(&mp));
       if(rc!=0)
       {
          cerr<<strerror(rc)<<"in thread2"<<endl;
          exit(EXIT_FAILURE);
       }
    //lets wait for the thread to finish
       rc = pthread_join(th1, NULL);
       if ( rc != 0)
       {
          cerr<<strerror(rc)<<"join failure for thread1"<<endl;
          exit(EXIT_FAILURE);
       }

       rc = pthread_join(th2, NULL);
       if ( rc != 0)
       {
          cerr<<strerror(rc)<<"join failure for thread2"<<endl;
          exit(EXIT_FAILURE);
       }

       cout<<"Map data"<<endl;
    //now print it
       for_each(mp.begin(), mp.end(), MpPrintObj);
       cout<<endl;

       return 0;
    }

但它不起作用。有谁能建议我一些方法?

2 个答案:

答案 0 :(得分:1)

您只是测试插入,可能会以线程安全的方式实现,也可能不会以您所知道的方式实现。但是,您的测试并不完整。允许线程将相同的密钥写入map,如果没有多个线程,您可能会遇到错误。

   // ins_th1
   for(int i =0 ; i<10000; i++)
      mp->insert(pair<int,int>(i, i+1000));

   // ins_th2
   for(int i=0; i<10000; i++)
      mp->insert(pair<int, int>(i, i+2000));

您也应该从map测试删除。当我修改程序以填充map时,在启动线程之前,只有线程从map中删除了一些东西,程序是实时锁定的。

   // ins_th1
   for(int i =0 ; i<5000; i++)
      mp->erase(i);

   // ins_th2
   for(int i=5000; i<10000; i++)
      mp->erase(i);

   // near top of main
   for(int i =0 ; i<5000; i++)
      mp.insert(pair<int,int>(i, i+1000));
   for(int i=5000; i<10000; i++)
      mp.insert(pair<int, int>(i, i+2000));
   //... launch threads

答案 1 :(得分:0)

我试着像你说的那样实施。

但是尽管没有使用任何同步机制,我得到了完美的结果。