QSemaphore信号量实现多线程while循环的单次循环同步

定义全局信号量,我根据生产者和消费者的思路为两个测试线程分别定义了信号量。

QSemaphore semaphore(1);//信号量定义,一次acquire使用一个资源
QSemaphore semaphore_(1);//信号量定义,一次release释放一个资源
//我们需要实现单次循环的同步,所以输入为1
vector<int> flag0;

最主要的逻辑在于:在本线程acquire,在另一个线程releaseflag0用于检测线程运行是否交叉(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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值