由于公司项目需要,需开启线程下载,开启线程后不结束,需同时开启多个。线程内处理方法是循环判断能否需要下载,然后通过一个统一 的方法获取下载内容开始下载。需要退出时,修改变量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);
}
}
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); ///这个不行,不能多次做这个事情,这个不是同步手段,只是释放临界区资源而已
::EnterCriticalSection(& g_cs); //同一线程 ,可以多次进入同一临界区,注意这个才是同步手段,占用临界区
download();
::LeaveCriticalSection( & g_cs); //当然退出次数也要相同,注意这个是解除占用
::DeleteCriticalSection( & g_cs); ///这个不行,不能多次做这个事情,这个不是同步手段,只是释放临界区资源而已
5
5
加了锁之后,无非还是单线程执行,原因是多个线程不能同时执行download方法;假如download方法没有使用公共的资源,则不用加锁
10
针对你这个应用
这个 download 应该分解为的更细致任务(块)
然后用多线程,处理不同任务(块)之间通过临界区,进行同步(把公用资源的使用串行化)
同步的目标是把不占用公共资源的代码,并行化
把占用公共资源的代码串行化。
以便合理利用资源,
提高程序运行效率,
以及多线程之间进行通讯。
这个 download 应该分解为的更细致任务(块)
然后用多线程,处理不同任务(块)之间通过临界区,进行同步(把公用资源的使用串行化)
同步的目标是把不占用公共资源的代码,并行化
把占用公共资源的代码串行化。
以便合理利用资源,
提高程序运行效率,
以及多线程之间进行通讯。
10
尽量用信号量,避免空循环。
临界区的初始化一次就够了,销毁了就不能起到相应作用。
bExit尽量用原子类型,多cpu下有隐患。
download函数实现什么功能,你没有说清楚。
临界区的初始化一次就够了,销毁了就不能起到相应作用。
bExit尽量用原子类型,多cpu下有隐患。
download函数实现什么功能,你没有说清楚。
5
针对你这个应用
这个 download 应该分解为的更细致任务(块)
然后用多线程,处理不同任务(块)之间通过临界区,进行同步(把公用资源的使用串行化)
同步的目标是把不占用公共资源的代码,并行化
把占用公共资源的代码串行化。
以便合理利用资源,
提高程序运行效率,
以及多线程之间进行通讯。
的确,临界区会让多个线程同时只有一个在执行download函数,这肯定和你的想法是不同的。
看你的download函数写得能否多线程安全,就是避免使用公共资源,例如全局变量、系统对象(文件、套接字)之类的。
假如你多个download下载的是不同的文件,可以各自维护文件句柄和套接字,基本不需要临界区加锁。唯一要加锁的是假如你的线程要向主进程交互的代码块。