定义全局信号量,我根据生产者和消费者的思路为两个测试线程分别定义了信号量。
QSemaphore semaphore(1);//信号量定义,一次acquire使用一个资源
QSemaphore semaphore_(1);//信号量定义,一次release释放一个资源
//我们需要实现单次循环的同步,所以输入为1
vector<int> flag0;
最主要的逻辑在于:在本线程acquire,在另一个线程release。flag0
用于检测线程运行是否交叉(flag0
会根据运行先后顺序写入线程序号)
线程的run
函数如下:
void total_thread::run()
{
while (thread_shutup == 0)
{
double t1 = clock();
double sum=0;
if (order == 0)
{
semaphore.acquire();
}
else
{
semaphore_.acquire();
}
for (int i = 0; i < 100000; i++)
{
sum += i;
}
//msleep(10);
qDebug() << "This is thread" << order;
mutex->lock();
flag0.push_back(order);
mutex->unlock();
if (order == 0)
{
semaphore_.release();
}
else
{
semaphore.release();
}
//double t2 = 1000 * (clock() - t1) / CLOCKS_PER_SEC;
//qDebug() <<"thread"<<order<<": "<< t2<<"ms";
}
}
检测是否交叉的代码:
int j;
int ff = 0;
for (int i = 0; i < flag0.size()-1; i++)
{
j = i + 1;
if(i%2==0&& flag0[i]== flag0[j])
ff++;
}
if(ff>0)
{
qDebug() << "Thread overlaps exist";
}
else
qDebug() << "No thread overlap exists";
结果:
没有使用信号量
使用信号量:
总结:本次尝试十分初级实现了while循环的单次循环同步,如果其中一个信号量输入为2,对应的线程则可以多循环一次才需要release,因此不会单次循环。具体信号量的概念可参考:QSemaphore