我想在同时写入条件下模拟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;
}
但它不起作用。有谁能建议我一些方法?
答案 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)
我试着像你说的那样实施。
但是尽管没有使用任何同步机制,我得到了完美的结果。