请教先后两次进入同一个线程,后进的覆盖前一次进入的还是并行运行呢?
我用AfxBeginThread创建了一个线程,当某种消息发生时,该线程启动.
我的问题是如果此消息短时间内连续两次发生,当前一次消息发生时线程的运行还没有结束,而后一次消息发生也已经进入线程运行,那么后一次线程的运行是否会覆盖前一次的线程运行呢?还是两次线程并行运行呢?
如果是两次同步并行运行的话,为了防止共同的数据被修改,我有没有必要在每次线程运行之前,调用一次Terminate结束上次尚未正常结束的线程呢?我想防止两次线程并行运行.
消息A--> 线程B
线程B
{
...//此时可能又会产生 消息A--> 线程B,此时上一次的线程会自动结束吗?还是两次并行运行呢?
return 0;
}
谢谢!
[解决办法]
并行运行的.
在合适的地方使用线程锁 就可以了.
[解决办法]
好像你还是先找个操作系统原理的书来看看。
你现在说的话我读不懂。什么叫“先后2次进入同一线程”呀。
[解决办法]
宏观上是并行运行的.微观上如果只有一个cpu的话就是串行的。
并行运行时:要用到一些共享数据的保护机制,比如临界区,信号量等等。
[解决办法]
是并行运行的,而且两者之间除了全局变量之外,两个线程之间毫无关系,不会受到对方的影响。
[解决办法]
AfxBeginThread创建了一个线程,当某种消息发生时,该线程启动
====================
这里不是很明白.
你的意思是每当一个消息发生时就用AfxBeginThread创建一个线程并运行
还是用AfxBeginThread创建一个线程,但线程是等待状态,当消息发生时正式启动运行
我想你说的是后者,那么总共就只有一个线程,发生的第一个消息它就运行了,再发生消息不会又产生一个线程运行.
[解决办法]
并行,不用结束前一个进程,可以使用进程锁锁定共享的变量,使它们在同一个时间内只有一个可以修改这个变量。
[解决办法]
什么叫“先后2次进入同一线程”呀??
同一个线程没有先后进入的问题,只有启动了几个线程
按LZ的意思,可能是用同一个线程函数,先后启动两个线程的问题,
如果在那个线程函数中,没有用到全局的变量和static变量,这种函数是可以线程重入的
[解决办法]
说了半天,就是
用同一线程函数,先后启动多个线程。
现在要求同一时间,只允许启动一个线程。
直接设个标志阿,线程启动前检查标志,
然后修改这个标志,启动线程。
线程结束时,再次修改这个标志。
修改和检查标志时,用临界区或互斥锁保护一下就行了。
[解决办法]
很简单,保留你的线程句柄,消息触发时,GetExitCodeThread(),检验线程是否在运行。
如果在运行就结束它。然后在CreateTread()
[解决办法]
bool bThreadLock=false;//线程锁
void* ThreadCall(void *p)
{
if(bThreadLock)//如果线程被锁,直接返回
{
return 0;
}
else
{
bThreadLock=true;//锁线程
//do you work//执行任务
//....
bThreadLock=false//释放锁
}
}
//这个实现考虑不全,但是线程锁基本是这样实现
[解决办法]
线程和函数都有可重入性的。
[解决办法]
我以前遇到这个问题,使用临界区对象解决问题的.
1.线程函数可重入就可以解决问题
或者
2.使用临界区对象即可
临界区(CCriticalSection)
进入时候:CCriticalSection::Lock
离开时候:CCriticalSection::Unlock
[解决办法]
是不是可以这样做,建一个隐藏窗口(如果已经有窗口就不用建了),开一个线程监视外部脉冲,如果收到脉冲就给窗口PostMessage(如果涉及到数据可以让线程new出空间,直接postmessage给窗口,窗口处理完后再delete).
这种方式可以确保监视线程的高效,又没有多线程的烦恼。
个人觉得只有你在真正需要多线程的时候再多线程,比如说你这里外部监视是一定要开个线程的,另外的线程其实不用开。
[解决办法]
并