【问题标题】:How to identify function called from thread or process in msvc如何识别从 msvc 中的线程或进程调用的函数
【发布时间】:2020-02-12 16:17:05
【问题描述】:

我有如下程序,函数 Foo 由线程和主进程调用。现在如何识别函数Foo是由线程或主进程调用的。

#include <Windows.h>
#include <stdio.h>
DWORD WINAPI Foo(LPVOID lPtr);
int main()
{
    DWORD dwExitCode;
    DWORD dwThreadID;
    HANDLE hT[10];
    int i;
    for( i = 0; i<5; i++)
    hT[i] = CreateThread(
        NULL,
        0,
        Foo,
        0,
        0,
        &dwThreadID
        );
        fflush(stdout); 
    Foo(0);
    return 0;
}

DWORD WINAPI Foo(LPVOID lPtr){
  printf("\ninside the Function");
  return 0;
}

【问题讨论】:

  • 这是否是有用的信息值得怀疑。但是如果你需要知道,你将不得不将它传递给你的线程函数。有一个 lpParameter 可以用于任何你认为合适的事情。
  • 检查线程 ID 是一种显而易见的方法
  • 顺便说一句,没有“主进程”这样的东西。它只是进程中的主线程或第一个线程。这段代码调用了五次 CreateThread(),为您提供了一个包含六个线程的进程。

标签: winapi msdn msvc12


【解决方案1】:

main() 中调用GetCurrentThreadId(),然后在Foo() 中再次调用,看看这两个值是否匹配,例如:

#include <Windows.h>
#include <stdio.h>

DWORD WINAPI Foo(LPVOID lPtr);
DWORD dwMainThreadId;

int main() {
    DWORD dwExitCode;
    DWORD dwThreadID;
    HANDLE hT[10];
    int i;

    dwMainThreadId = GetCurrentThreadId();

    for( i = 0; i<5; i++)
        hT[i] = CreateThread(
            NULL,
            0,
            Foo,
            0,
            0,
            &dwThreadID
        );
    fflush(stdout);
    Foo(0);
    return 0;
}

DWORD WINAPI Foo(LPVOID lPtr){
    DWORD dwThisThreadId = GetCurrentThreadId();
    printf(
        "\ninside the Function in thread %u (%s)",
        dwThisThreadId,
        (dwThisThreadId == dwMainThreadId) ? "main" : "worker"
    );
    return 0;
}

【讨论】:

    猜你喜欢
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多