2,408
社区成员
发帖
与我相关
我的任务
分享
#include <QtCore/QCoreApplication>
#include <QThread>
#include <QSemaphore>
#include <QMutex>
#include <Windows.h>
#define THREAD_NUMBER 20
QSemaphore m_producer;
QSemaphore m_customer;
volatile long long GolbalSum = 0;
class MyThread: public QThread
{
public:
MyThread(QObject *parent=0);
~MyThread();
void run();
public:
long long *m_sum;
bool m_bExit;
QMutex m_singleTask;
QMutex m_TaskDone;
};
MyThread::MyThread(QObject *parent/* =0 */):QThread(parent)
{
m_sum = 0;
m_bExit = false;
m_TaskDone.lock();
start();
}
MyThread::~MyThread()
{
m_bExit = true;
m_singleTask.unlock();
}
void MyThread::run()
{
m_singleTask.lock();
m_singleTask.lock();
while (!m_bExit)
{
if (!m_producer.tryAcquire(1, 1))
{
continue;
}
// handle the task
for (int i = 0; i < 500000; ++i)
(*m_sum)++;
m_customer.release();
m_singleTask.lock();
}
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
int loopCnt = 1000;
MyThread threads[THREAD_NUMBER];
long long threadsSum[THREAD_NUMBER];
LARGE_INTEGER freq_detect, before_detect, after_detect;
QueryPerformanceFrequency(&freq_detect);
while(1)
{
for (int i = 0; i<THREAD_NUMBER; ++i)
{
threads[i].m_sum = &threadsSum[i];
threads[i].m_singleTask.unlock();
}
if (0)//loopCnt-- <= 0)
{
for (int i = 0; i<THREAD_NUMBER; ++i)
{
threads[i].m_bExit = true;
threads[i].wait();
}
break;
}
Sleep(8);
QueryPerformanceCounter(&before_detect);
m_producer.release(THREAD_NUMBER);
m_customer.acquire(THREAD_NUMBER);
QueryPerformanceCounter(&after_detect);
printf("%f %f %f\t", before_detect.QuadPart*1e3/freq_detect.QuadPart,
after_detect.QuadPart*1e3/freq_detect.QuadPart, (after_detect.QuadPart-before_detect.QuadPart)*1e3/freq_detect.QuadPart);
for (int i=0; i<THREAD_NUMBER; ++i)
{
GolbalSum += *threads[i].m_sum;
}
printf("Current sum:%I64d\n", GolbalSum);
}
//return a.exec();
}