线程如何安全退出?
线程如何安全退出?
我在程序里使用1个不断分析UDP包,并且将数据写入数据库的线程:thread1
我点击“开始”,启动正常:
thread1 = new TMyThread(true ,mmShow);
thread1->Resume();
我“退出”,出现死循环,不在往数据库插入数据,但分析UDP的动作依然继续:
thread1->Suspend();
thread1->Terminate();
delete thread1;
如仅仅使用:
thread1->Suspend();
平时很正常,但是偶尔会出现 thread error:5 的错误
如仅仅使用:
thread1->Terminate();
线程仍在工作,并没有终止。
如何解决呢?
[解决办法]
可以利用TEvent保证在必要的操作执行后退出。
当程序中一个线程的运行要等待一项特定的操作的完成而不是等待一个特定的线程完成时,我们就可以很方便地用TEvent对象来实现这个目标。首先创建一个全局的TEvent对象作为所有线程可监测的标志。当一个线程完成某项特定的操作时,调用TEvent对象的SetEvent()方法,这样将设置这个标志,其他的线程可以通过监测这个标志获知操作的完成。相反,要取消这个标志,可以调用ResetEvent()方法。在需要等待操作完成的线程中使用WaitFor()方法,将一直等待这个标志被设置为止。注意WaitFor()方法的参数是等待标志设置的时间,一般用INFINITE表示无限等待事件的发生,如果其它线程运行有误,很容易使这个线程死住(等待一个永不发生的事件)。
其实直接用Windows API函数也可以很方便地实现事件(Event)、信号(semaphore)控制技术。尤其是C++Builder,在调用Windows API方面有着其它语言无可比拟的优势。所用的函数主要有:CreateSemaphore()、CreateEvent()、WaitForSingleObject()、ReleaseSemaphore()、SetEvent()等等。
[解决办法]
你是不是在Execute函数里面做了一个死循环啊,我以前也遇到过这种问题,你用下面这种方式试试看。
Execute()
{
while (!Terminated)
{
//在这里做要做的事情,这里一定不要出现死循环
}
}
想要暂停或者停止线程运行直接调用Suspend()或者Terminate(),应该是没什么问题的。
[解决办法]
方法一 用全局变量 在每次循环的时候判断 控制线程退出
方法二 用事件对象判断(同上)
如果有阻塞 就要注意了