我的多线程程序运行缓慢或在双核机器上出现死锁,请帮忙

Sha*_*Guo 2 c c++ winapi multithreading

我有一个包含多个线程的程序,一个线程将在退出时更改全局,另一个线程将重复轮询全局.对全局变量没有任何保护.该程序在单处理器上运行良好.在双核机器上,它会工作一段时间,然后在Sleep(0)或SuspendThread()上停止.有人能帮我解决这个问题吗?

代码如下:

Thread 1:

do something...
while(1)
{
.....
flag_thread1_running=false;
SuspendThread(GetCurrentThread());
continue;

}

Thread 2
flag_thread1_running=true;
ResumeThread(thread1);
.....do some other work here....
while(flag_thread1_running) Sleep(0);
....
Run Code Online (Sandbox Code Playgroud)

dth*_*rpe 14

您在单处理器计算机上没有看到任何问题但是在多进程计算机上看到问题这一事实是单处理器计算机上相对较大粒度的线程上下文切换的工件.在线程调度程序将执行切换到不同的线程之前,线程将执行N个时间量(毫秒,纳秒,等等).许多CPU指令可以在典型的线程时间片中执行.你可以把它想象为具有相当大块的,在此期间,因为没有其它的处理器上执行,你可能不会遇到资源冲突"自由发挥"的独家处理器时间.

但是,在多进程计算机上运行时,两个线程中的CPU指令会同时执行."免费玩"大块时间的大小几乎为零.

要重现两个线程之间的资源争用问题,您需要让线程1访问资源,并使线程2同时或几乎同时访问资源.

在单处理器机器上进行的大粒度线程切换中,线程切换恰好在正确位置发生的可能性很小,因此在单机器上正常使用时程序可能永远不会出现故障.

在多进程机器中,指令在两个线程中同时执行,因此线程1和线程2同时访问同一资源的可能性要大得多 - 比单处理器方案的可能性高出数千倍.

我已经看到它发生很多次:已经好几年UNIPROC机当新multiproc机器上执行突然开始出现问题所有的地方运行良好的应用程序.原因是原始代码中存在一个潜在的线程错误,它根本就没有在uniproc机器上重复计时.

使用多线程代码时,在多进程硬件上测试代码绝对是不可能的.如果代码中存在线程冲突问题,它们将很快出现在多进程机器上.

正如其他人所说,除非你是一个调试器,否则不要使用SuspendThread().使用互斥锁或其他同步对象来协调线程.