我想通过控制线程执行顺序来调试一个多线程程序,我正在使用C++和gdb。除了主线程外,我还有两个线程(用于示例程序),我想在保持另一个线程停止的同时调试一个线程。
这是我编写的示例程序:
#include <iostream>
#include <pthread.h>
#include <stdlib.h>
#define NUM_THREADS 2
using namespace std;
void * run (void *) {
for (int i = 0; i < 3; ++i) {
sleep(1);
cout << i << " " << pthread_self() << endl;
}
pthread_exit(NULL);
}
int main (int argc, char** argv) {
cout << "Start..." << endl;
int rc;
pthread_t threads[NUM_THREADS];
for (int i = 0; i < NUM_THREADS; ++i) {
rc = pthread_create(&threads[i], NULL, run, NULL);
if (rc) {
cout << "pthread_create returned error: " << rc << endl;
exit(-1);
}
}
pthread_exit(NULL);
}
我在使用gdb时,在带有sleep(1)
的代码行处设置了断点。然后运行程序,启动了三个线程(其中线程2和3是pthread),并且程序正在线程2上等待(在sleep(1)
处)。现在,我想让线程3继续执行,而保持在线程2中,并通过在gdb中执行c
命令来逐步执行线程2。
我尝试过set scheduler-locking on
,但它似乎没有按照我的期望工作。当我位于线程2中时,我使用set scheduler-locking on
,然后执行几次continue
(到目前为止一切顺利,我仍然在线程2中),然后切换到线程3,使用set scheduler-locking on
,continue
,但由于某种原因,我又回到了线程2中...根据我的理解,这不应该发生。我是否遗漏了什么?