【问题标题】:How do I declare a bool function in a window.h thread?如何在 window.h 线程中声明布尔函数?
【发布时间】:2013-10-04 01:58:00
【问题描述】:

对于我的任务,我需要编写一个多线程程序,在一个单独的线程中输出所有小于或等于用户输入数字的素数。

我是线程新手,不完全了解如何正确实现它们。但是我创建了一个布尔函数来确定一个整数是否是素数,我将它命名为 bool isPrime。但是,布尔 isPrime 给了我以下错误“声明与“LPVOID isPrime”不兼容。我不知道如何修复它,我还注意到我的编译器(visual c++)为“cout”和“cin”但是如果我声明使用命名空间std,编译器会在“std”下划线并给出这个错误“name must be a namespace name”,我不知道它应该是什么意思。我该如何解决这两个问题?

#include <Windows.h>

DWORD Prime;


DWORD WINAPI primeThreadFun(LPVOID isPrime)
{
    bool isPrime(int n)
    {    
        float sqrtn = sqrt(n);
        if (n < 2) return false;
        if (n < 4) return true;
        if (n % 2 == 0) return false;
        for (int d = 3; d <= sqrtn; d += 2)
        if (n % d == 0) return false;
        return true;
    }

}

int main(int argc, char *argv [])
{
    DWORD ThreadId;

    HANDLE ThreadHandle;

    int n;
    cout << "Enter a number: " << endl;
    cin >> n;
    for (int i = 0; i <= n; i++)
    if (isPrime(i)) cout << i << " ";
    cout endl;
}

ThreadHandle = CreateThread(NULL, 0, primeThreadFun, (LPVOID) isPrime, NULL, ThreadID []);

if (ThreadHandle != NULL)
{
    WaitForSingleObject(ThreadHandle INFINITE);

    CloseHandle(ThreadHandle);
}

}

【问题讨论】:

    标签: c++ multithreading


    【解决方案1】:

    首先,CreateThread 需要一个特定的签名 (reference):

    DWORD WINAPI ThreadProc(LPVOID lpParam);
    

    所以你的线程声明需要相同的签名。

    其次,您尝试做的不是分离线程的好方法。将线程视为一个单独的进程。它会做一些任务然后结束。

    您需要执行类似的操作(注意:以下内容未经过调试,只能用作起点 - 这是有意完成的,因为我不是来为您做作业的):

    struct MyData
    {
        std::vector<unsigned int> myVec;
        unsigned int myCap;
    };
    
    DWORD WINAPI MyThreadProc(LPVOID lpParam)
    {
        MyData* pData = (MyData*)lpParam;
        for (int i = 4; i <= myCap; ++i)
        {
            int root = (int)std::sqrt(i);
            bool isPrime = true;
            for (int j = 2; j <= root; ++j)
            {
                if (i % j == 0)
                {
                    isPrime = false;
                    break;
                }
            }
    
            if (isPrime)
            {
                pData->myVec.push_back(i);
            }
        }
    
    }
    
    int main()
    {
        MyData data;
        std::cin >> data.myCap;
        HANDLE hThread = CreateThread(NULL, 0, MyThreadProc, &data, NULL, NULL);
        std:: cout << "Finding Primes" << std::endl;
        while (WaitForSingleObject(hThread, 1000) != WAIT_OBJECT_0)
        {
            std::cout << ".";
        }
        std::cout << std::endl;
        std::copy(data.begin(), data.end(), std::ostream_iterator<unsigned int>(std::cout, " "));
        return 0;
    }
    

    【讨论】:

    • 你为什么使用 struct MyData { std::vector myVec;无符号 int myCap; };它应该做什么?
    • 它是给你线程的对象。它包含质数向量和您在下面搜索的上限。您应该对其进行同步,但我在此演示中忽略了它。
    【解决方案2】:

    C/C++ 不支持嵌套函数——isPrime 嵌套在 primeThreadFun 中。 将其移出,并从 primeThreadFun 中调用它。

    另外,你有一个名为“isPrime”的全局变量——你不能拥有它和一个全局函数“isPrime()”

    对于 cout,您需要包含“iostream”

    【讨论】:

    • 如何将其移出并从 primeThreadFun 中调用?所以,我应该包括 using namespace std,不是吗?
    • 如果我这样做 #include 它告诉我“无法打开源文件 iostream.h”
    • "iostream" 没有 .h.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多