jjzjj

c - _beginthread 和 WaitForSingleObject

coder 2024-06-04 原文

我正在实现一个启动 4 个线程的程序。

函数是:

void* SOURCE_in(struct SOURCE_1*);
void* SOURCE_out(struct SOURCE*);
void* SINK_out(struct SINK_1*);
void* SINK_in(struct SINK*);

这些函数允许 4 个 block 之间进行通信。 Block 1 与 Block 2 通信。 block 2 与第三 block 共享信息。 Block 3 与 Block 4 进行信息通信。

我的问题在 main.c 中

int main(int argc, char** argv){

    extern int p, e_source, e_sink_1, l_sink, l_source_1, flag, ctr_source;
    extern int ctr_source_1, ctr_sink, ctr_sink1;

        SOURCE source;      /*C struct*/
        SINK sink;          /*C struct*/
        SOURCE_1 source_1;  /*C struct*/
        SINK_1 sink_1;      /*C struct*/

        HANDLE CHT[4];

        p = 0;
        e_source =  flag = 0;
        l_sink = e_sink_1 = l_source_1 = 1;
        max = 5;
        ctr_source = ctr_source_1 = ctr_sink = ctr_sink_1 = 0;

        /*Initialize FIFO*/
        F *f1 = fifo_init(10);
        F *f2 = fifo_init(10);

        /*Connect FIFO and modules*/
        source.output_source = f1;
        sink.input_sink = f1;

        sink_1.output_sink = f2;
        source_1.input_source = f2;

        /*Create Threads*/
        CHT[0] = (HANDLE)_beginthread((void (*)(void *))&SOURCE_out, 0, &f1);
        CHT[1] = (HANDLE)_beginthread((void (*)(void *))&SINK_in, 0, &f1);
        CHT[2] = (HANDLE)_beginthread((void (*)(void *))&SINK_out, 0, &f2);
        CHT[3] = (HANDLE)_beginthread((void (*)(void *))&SOURCE_in, 0, &f2);

        /* Wait until all threads have terminated */

        WaitForSingleObject(CHT[0], INFINITE);
        WaitForSingleObject(CHT[1], INFINITE);
        WaitForSingleObject(CHT[2], INFINITE);
        WaitForSingleObject(CHT[3], INFINITE);

        getchar();

        return 0;}

我读到 WaitForSingleObject 函数不适用于 _beginthread.... 但是我的函数不是 nunsigned __stdcall 类型...

我构建的程序没有错误,我使用断点来测试它,它没问题。 当我编译时我遇到了这个问题:

线程“Win32 线程”(0x11ec) 已退出,代码为 0 (0x0)。 线程“Win32 线程”(0x918) 已退出,代码为 0 (0x0)。 线程“Win32 线程”(0x8a4) 已退出,代码为 0 (0x0)。 线程“Win32 线程”(0x2a8) 已退出,代码为 -1073741510 (0xc000013a)。 线程“Win32 线程”(0x12f8) 已退出,代码为 -1073741510 (0xc000013a)。 程序“[3984] SW=SW.exe: Native”已退出,代码为 -1073741510 (0xc000013a)。

程序永远不会到达函数 getchar()

在做这个程序之前,我做了一个程序,在两个 block 之间进行通信,一个读,另一个写。在那种情况下,我没有任何问题。

如果我不使用 WaitForSingleObject 函数,问题就会消失,但我的程序几乎总是在完成之前停止。

每个线程使用的函数,以中断方式停止。 但我希望其他的继续下去,直到它出现为止。

最佳答案

_beginthread 的文档说明您不能使用其中一个等待功能:

The following sample code demonstrates how you can use the thread handle returned by _beginthreadex with the synchronization API WaitForSingleObject. The main thread waits for the second thread to terminate before it continues. When the second thread calls _endthreadex, it causes its thread object to go to the signaled state. This allows the primary thread to continue running. This cannot be done with _beginthread and _endthread, because _endthread calls CloseHandle, destroying the thread object before it can be set to the signaled state.

并且本文还为您提供了解决方案,即改用_beginthreadex

我认为当你这么说的时候你在问题中暗示了这一点

but my functions are not __stdcall

您只需更改函数即可使用 __stdcall 调用约定。

关于c - _beginthread 和 WaitForSingleObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10448121/

有关c - _beginthread 和 WaitForSingleObject的更多相关文章

  1. c++ - 在 C++ 中使用带有指针结构的 beginthread - 2

    我正在做一个项目,在这个项目中我必须使用指针结构作为线程的输入参数。我的代码看起来像这样:structcoord{double*xPos;double*yPos;};voidcdeclfoo(void*inData){coord*my_data=(coord*)inData;printf("Threadvalues:\n");printf("xVal:%f\n",*(my_data->xPos));printf("yVal:%f\n",*(my_data->yPos));}主体看起来像这样:{doublestartX=10;doublestartY=10;/*declarevariab

  2. c++ - 在 Windows 上使用 WaitForSingleObject 但支持 boost 线程中断 - 2

    Boost线程具有“可中断”的便利特性。该框架在您sleep等时引入了中断点。但是,使用阻塞Win32调用可以规避此功能。例如,WaitForSingleObject会阻塞一个线程,但不会让它被boost线程的中断机制打断。有什么方法可以包装WaitForSingleObject或告诉boost等待Win32事件句柄,以便我可以重新获得中断点? 最佳答案 detail::win32::interruptible_wait实现了这一点。如您所见,它等待3个句柄(除了调用者指定的句柄之外还有2个)以接受中断。具体看WaitForMult

  3. c++ - WaitForSingleObject 问题 - 2

    先仔细阅读问题。有一个从CTest类的CreateInstance生成的工作线程。这是该类的原型(prototype)。hThread是线程句柄,hEventShutdown是程序退出时用于关闭线程的事件。WaitForShutdown是用于向hEventShutdown发出信号并等待线程句柄直到线程正常退出的公共(public)函数。WaitForShutdown在应用程序退出时被调用。//pseudocodeCTest{public:CTest*CreateInstance();staticthreadproc(void*pv);voidWaitForShutdown();publ

  4. c# - 从 C# 调用 WaitForSingleObject - 2

    我正在尝试从C#调用WaitForSingleObject方法,如此处所述:https://msdn.microsoft.com/en-us/library/windows/desktop/ms687032(v=vs.85).aspx为了调用这个函数我需要创建一个Handle,或者我需要得到一个IntPtr类型的Handle,如何实现?我已经尝试过我发现的这个功能:http://www.pinvoke.net/default.aspx/kernel32.WaitForSingleObject[DllImport("coredll.dll",SetLastError=true,Calli

  5. c++ - 时间过去了,直到 WaitForSingleObject 返回 - 2

    有没有办法知道从我调用WaitForSingleObject函数到它返回之间经过了多少时间?或者唯一知道的方法是使用某种计时器? 最佳答案 在调用WaitForSingleObject()之前只存储当前时间。然后比较它返回的时间。来自http://msdn.microsoft.com/en-us/library/windows/desktop/ms725473(v=vs.85).aspx-选择一个函数来检索时间。 关于c++-时间过去了,直到WaitForSingleObject返回,我

  6. c++ - _beginthread/ex C3861 - 找不到标识符 - 2

    这是我的测试代码#include"stdafx.h"#include"windows.h"#include"iostream"usingnamespacestd;HANDLEhMutex;staticunsigned__stdcallthreadFunc(void*params){WaitForSingleObject(hMutex,INFINITE);printf(":D:D:D\n");ReleaseMutex(hMutex);returnNULL;}int_tmain(intargc,_TCHAR*argv[]){hMutex=CreateMutex(NULL,FALSE,NUL

  7. linux - Linux 中是否有任何 CreateEvent、WaitForSingleObject 和 SetEvent 等价物? - 2

    最近我需要将我的项目从Windows移植到Linux,但存在一些WIN32API,如CreateEvent、WaitForSingleObject、SetEvent等。在Linux中是否有任何等效项?LinuxOSAPI或自己实现的函数都可以。 最佳答案 好吧,您没有提到您使用的编程语言。例如在C++11中你可以这样做。您可以在此处找到示例:https://github.com/moya-lang/Event 关于linux-Linux中是否有任何CreateEvent、WaitForS

  8. c++ - 在 win32::WaitForSingleObject 期间 Windows 上的 Boost.Thread 断言/崩溃 - 2

    我的代码中有一个很少发生的问题会触发断言,涉及Boost.Thread库。我无法使用独立示例重现此问题,而且我也不知道是什么原因造成的,因此很难提供示例案例。我希望任何熟悉boost.thread内部结构的人都能提供帮助。这是我知道的:问题发生在boost::lock_guard(或unique_lock和普通非递归互斥锁的变体)被声明。它发生在Boost.Asio的处理函数中。堆栈上是执行io_service::run的线程,一堆调用Asio回调函数的胶水,然后是我的回调函数(由async_write调用触发)。该函数的第一行是lock_guard的声明这是导致问题的原因。this我

  9. c++ - WaitForSingleObject 卡住应用程序 - 2

    我有一个检测进程创建的内核驱动程序,以及一个显示结果的应用程序。我正在使用WaitForSingleObject(event,INFINITE)来检测进程创建。它在控制台应用程序中运行良好,但是当我将它添加到GUI应用程序中时,整个应用程序卡住了。我怀疑这是由于WaitForSingleObject造成的,在谷歌搜索后,我尝试使用MsgWaitForMultipleObjects但没有成功。编辑:我正在使用C++Windows窗体应用程序我必须继续等待,因为我正在“永远”监控,而不仅仅是为了一次性事件......如果您需要,我可以提供代码或更多信息,感谢任何形式的帮助,谢谢!我在我的C

  10. c - GetOverlappedResult(bWait=TRUE) 与 WaitForSingleObject() 对于重叠 I/O - 2

    当我在Win32api上以OVERLAPPED方式打开和读取文件时,我有几种方法来完成IO请求,包括使用等待文件句柄(或重叠结构中的事件)WaitForSingleObjectGetOverlappedResult和bWait=TRUE这两个函数似乎具有相同的效果:线程停止直到句柄或事件发出信号,这意味着数据被放置在提供给ReadFile的缓冲区中。那么,有什么区别呢?为什么我需要GetOverlappedResult? 最佳答案 我完全同意RemusRusanuanswer.也改为创建自己的IOCP和线程池,它们将在此IOCP上监

随机推荐