我正在尝试编写一个Teamcenter ITK(基于c)程序,该程序将作为从主线程调用的不同线程运行。主要线程是从UI上的操作调用的。由于子线程需要花费大量时间才能完成,如果我不创建子线程并将代码放在主线程中,则UI会冻结最多10分钟,这是不可接受的。现在主线程和子线程都需要共享由主线程完成的身份验证,因为我正在使用SSO。他们还需要连接数据库。最后,主线程不应该等待子线程完成,因为具有子线程的整个目的将被击败。调用子线程的代码是
handle = (HANDLE) _beginthread (submitToPublishTibcoWf, 0, &input); // create thread
do
{
sprintf (message, "Waiting %d time for 1000 milliseconds since threadReady is %d\n", i++, threadReady);
log_msg (message);
WaitForSingleObject(handle, 1000);
}
while (!threadReady);
sprintf (message, "Wait for thread to be ready over after %d tries since threadReady is %d\n", i, threadReady);
log_msg (message);
log_msg ("Main thread about to exit now");
每当我要在子线程中执行需要8分钟运行的代码时,我就设置了threadReady = 1(全局变量)。
现在的问题是,在主线程退出后,子线程表现得很糟糕。我收到了这个错误:
2012年5月25日星期五11:34:46:主线即将退出 此应用程序已请求Runtime以不寻常的方式终止它。 请联系应用程序的支持团队以获取更多信息。
大多数子线程都会执行,但有时它只会在最后崩溃。
非常感谢任何帮助。
答案 0 :(得分:1)
为了防止退出子线程,我们可以使用分离来使子进程独立并且不希望从父进程加入。 因此,我们不应该加入儿童过程,在那之后,我们必须脱离主要的节俭。 像这样:
pthread_create(th, attr, what);
pthread_detach(th);
// and never join
另一个可能有用的东西:
1.如果你想为你的应用程序增加一些效率,我建议不要使用详尽的监听观察像threadReady这样的信号特殊事件。而是在pthread或gObject等其他信令方法中使用条件变量
2.您在线程之间共享一些数据,它可能会遇到互斥问题以及其他问题,例如多进程或多线程应用程序中的这些问题。请尝试使用某些机制(如互斥锁或条件变量的信号量)来处理这些问题。 。
问候。