c++多次调用同一线程加临界区问题

C++语言 码拜 8年前 (2016-09-12) 1361次浏览
由于公司项目需要,需开启线程下载,开启线程后不结束,需同时开启多个。线程内处理方法是循环判断能否需要下载,然后通过一个统一 的方法获取下载内容开始下载。需要退出时,修改变量bExit统一退出。此时download是一次次分开执行的吗,应该怎么样调试呢。
CRITICAL_SECTION g_cs;(全局变量)
Thread
{
while(bExit);
{
if(!condition)
{continue;}
::InitializeCriticalSection(& g_cs);
::EnterCriticalSection(& g_cs);
download();
::LeaveCriticalSection( & g_cs);
::DeleteCriticalSection( & g_cs);
}
}
解决方案

5

   ::InitializeCriticalSection(& g_cs);  这个不行,不能多次做这个事情,这个不是同步手段,只是初始化临界区而已
::EnterCriticalSection(& g_cs); //同一线程 ,可以多次进入同一临界区,注意这个才是同步手段,占用临界区
download();
::LeaveCriticalSection( & g_cs); //当然退出次数也要相同,注意这个是解除占用
::DeleteCriticalSection( & g_cs);   ///这个不行,不能多次做这个事情,这个不是同步手段,只是释放临界区资源而已

5

初始化临界区和删除临界区可以放到构造和析构里面

5

引用:
Quote: 引用:

要看具体的download代码才知道需要不需要加锁

download函数代码很多,主要是从url上获取地址,根据鼠标消息选择下载内容。调起的每个线程都会做这个操作,可能是同一网址也可能不同,所以肯定还是要加锁的。这种临界区的加锁能满足条件吗?多线程不是很熟悉

加了锁之后,无非还是单线程执行,原因是多个线程不能同时执行download方法;假如download方法没有使用公共的资源,则不用加锁

10

针对你这个应用
这个 download 应该分解为的更细致任务(块)
然后用多线程,处理不同任务(块)之间通过临界区,进行同步(把公用资源的使用串行化)
同步的目标是把不占用公共资源的代码,并行化
把占用公共资源的代码串行化
以便合理利用资源,
提高程序运行效率,
以及多线程之间进行通讯。

10

尽量用信号量,避免空循环。
临界区的初始化一次就够了,销毁了就不能起到相应作用。
bExit尽量用原子类型,多cpu下有隐患。
download函数实现什么功能,你没有说清楚。

5

引用:

针对你这个应用
这个 download 应该分解为的更细致任务(块)
然后用多线程,处理不同任务(块)之间通过临界区,进行同步(把公用资源的使用串行化)
同步的目标是把不占用公共资源的代码,并行化
把占用公共资源的代码串行化
以便合理利用资源,
提高程序运行效率,
以及多线程之间进行通讯。

的确,临界区会让多个线程同时只有一个在执行download函数,这肯定和你的想法是不同的。
看你的download函数写得能否多线程安全,就是避免使用公共资源,例如全局变量、系统对象(文件、套接字)之类的。
假如你多个download下载的是不同的文件,可以各自维护文件句柄和套接字,基本不需要临界区加锁。唯一要加锁的是假如你的线程要向主进程交互的代码块。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明c++多次调用同一线程加临界区问题
喜欢 (1)
[1034331897@qq.com]
分享 (0)