gpt4 book ai didi

c++ - 线程提前终止,代码为 255

转载 作者:可可西里 更新时间:2023-11-01 10:50:13 25 4
gpt4 key购买 nike

我试图在一个线程中运行我的程序的一部分,但得到了一个不寻常的结果。

我已经用 changes suggested by Remus 的结果更新了这个问题, 但由于我仍然遇到错误,我觉得问题仍然悬而未决。

我已经在一个 dll 中实现了功能,以绑定(bind)到一个供应商软件中。一切正常,直到我尝试在此 dll 中创建一个线程。

这是 DLL 的相关部分:

extern "C" {
__declspec(dllexport) void __cdecl ccEntryOnEvent(WORD event);
}

定义供应商软件调用的函数,然后:

using namespace std;

HANDLE LEETT_Thread = NULL;
static bool run_LEETT = true;
unsigned threadID;
void *lpParam;

int RunLEETTThread ( void ) {
LEETT_Thread = (HANDLE)_beginthreadex( NULL, 0, LEETT_Main, lpParam, 0 , &threadID );
//LEETT_Thread = CreateThread ( NULL, 0, LEETT_Main, lpParam, 0 , NULL );

if ( LEETT_Thread == NULL )
ErrorExit ( _T("Unable to start translator thread") );

run_LEETT = false; // We only wish to create the thread a single time.
return 0;
}

extern "C" void __cdecl ccEntryOnEvent(WORD event ) {
switch (event) {
case E_START:
if ( run_LEETT ) {
RunLEETTThread ();
MessageText ( "Running LEETT Thread" );
}
break;
}

WaitForSingleObject( LEETT_Thread ,INFINITE);
return;
}

函数声明为

unsigned __stdcall LEETT_Main ( void* lpParam ) {

LEETT_Main 在没有优化的情况下编译为独立的可执行文件时约为 136k(我有一个单独的文件,其中有一个调用与 myFunc 相同的函数的 main())。

在更改调用线程的方式之前,程序会在声明包含 std::list 的结构时崩溃,如下所示:

struct stateFlags {
bool inComment; // multiline comments bypass parsing, but not line numbering
// Line preconditions
bool MCodeSeen; // only 1 m code per block allowed
bool GCodeSeen; // only 1 g code per block allowed

std::list <int> gotos; // a list of the destination line numbers
};

它现在在 _beginthreadex 命令上崩溃,跟踪显示了这一点

    /*
* Allocate and initialize a per-thread data structure for the to-
* be-created thread.
*/
if ( (ptd = (_ptiddata)_calloc_crt(1, sizeof(struct _tiddata))) == NULL )
goto error_return;

通过这个追踪,我看到了一个错误 252(错误的指针),最终是 255(运行时错误)。

我想知道是否有人遇到过这种创建线程的行为(在 dll 中?),补救措施可能是什么。当我在我的玩具程序中创建这个结构的实例时,没有问题。当我删除列表变量时,程序只是在其他地方崩溃,在声明字符串时

在这一点上,我非常愿意接受建议,如果必须的话,我会暂时取消线程的想法,尽管它不是特别实用。

特别感谢那些再次阅读本文的人:)

最佳答案

使用 CRT 的线程(std::list 暗示 CRT)需要使用 _beginthreadex 创建, 如记录在 MSDN :

A thread in an executable that calls the C run-time library (CRT) should use the _beginthreadex and _endthreadex functions for thread management rather than CreateThread and ExitThread;

不清楚您是如何启动您的线程的,但看起来您是在不推荐的 DllMain 中执行此操作(参见 Does creating a thread from DllMain deadlock or doesn't it?)。

关于c++ - 线程提前终止,代码为 255,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6670450/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com