以下代码是可以正确执行的,但唯一不足的是,单线程和多线程的执行效率几乎相同。究竟是什么原因还没搞清楚。
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <boost/filesystem.hpp>
#include <boost/thread.hpp>
#include <geos/geos.h>
#include <vector>
#include "macros.h"
#include "threads.h"
using namespace std;
#pragma comment(lib,LIB_XD("geos_3_35"))
typedef boost::thread THREAD;
typedef boost::mutex MUTEX;
typedef Coordinate PT;
typedef boost::thread * PTHREAD;
int MAX_COUNT = 2;
int currentIndex = 0;
MUTEX mm;
void Union()
{
GeometryFactory factory;
CoordinateArraySequenceFactory csf;
CoordinateSequence* cs1 = csf.create(5,2);
cs1->setAt(PT(0,0,0),0);
cs1->setAt(PT(1,0,0),1);
cs1->setAt(PT(1,1,0),2);
cs1->setAt(PT(0,1,0),3);
cs1->setAt(PT(0,0,0),4);
LinearRing* ring1 = factory.createLinearRing(cs1);
Geometry* p1 = factory.createPolygon(ring1,NULL);
CoordinateSequence* cs2 = csf.create(5,2);
cs2->setAt(PT(4,4,0),0);
cs2->setAt(PT(4,5,0),1);
cs2->setAt(PT(5,5,0),2);
cs2->setAt(PT(5,4,0),3);
cs2->setAt(PT(4,4,0),4);
LinearRing * ring2 = factory.createLinearRing(cs2);
Geometry* p2 = (factory.createPolygon(ring2,NULL));
int index = 0;
while(index < MAX_COUNT)
{
{
LOCK(mm);
index = ++currentIndex;
}
if(index % 1000 == 0) cout << "count " << index << endl;
Geometry* poly = p1->Union(p2);
//int number = poly->getNumGeometries();
delete poly;
}
delete ring1;
delete ring2;
}
int main(int argc, char* argv[])
{
PTHREAD threads[8];
clock_t start, finish;
start = clock();
bool enabledThreadCount = 8;
for(int i = 0; i < enabledThreadCount ; i ++)
{
boost::thread * t = new boost::thread(&Union);
threads[i] = t;
}
for(int i =0; i < enabledThreadCount ; i++)
{
threads[i]->join();
delete threads[i];
}
finish = clock();
cout << "该程序运行时间为" << ((double)(finish - start)) / CLOCKS_PER_SEC << endl;
int pause;
cin >> pause;
return 0;
}