如何在window.h线程中声明bool函数?

时间:2013-09-27 17:05:30

标签: c++ multithreading

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

我是线程新手,并不完全了解如何正确实现它们。但我创建了一个布尔函数,它确定一个整数是否是素数,并将其命名为bool isPrime。然而,bool isPrime给了我以下错误“声明与”LPVOID isPrime不兼容“。我不知道如何解决它,我也注意到我的编译器(visual c ++)为”cout“提供了一个红色下划线“cin”但是如果我声明使用命名空间std,那么编译器会强调“std”并给出这个错误“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);
}

}

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

首先,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;
}