0

私の課題では、ユーザーが入力した数以下のすべての素数を別のスレッドで出力するマルチスレッド プログラムを作成する必要があります。

私はスレッドに不慣れで、それらを正しく実装する方法を完全には理解していません。しかし、整数が素数であるかどうかを判断するブール関数を作成し、bool isPrime と名付けました。ただし、bool isPrime を使用すると、「宣言は "LPVOID isPrime" と互換性がありません」というエラーが表示されます。修正方法がわかりません。また、コンパイラ (Visual C++) が "cout" に赤い下線を付けていることにも気付きました。 「cin」ですが、名前空間 std を使用して宣言すると、コンパイラは「std」に下線を付け、「名前は名前空間名でなければなりません」というエラーを表示しますが、これが何を意味するのかわかりません。 ?

#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);
}

}
4

2 に答える 2

1

C/C++ はネストされた関数をサポートしていません -- isPrime は primeThreadFun にネストされています。それを移動して、primeThreadFun から呼び出します。

また、「isPrime」という名前のグローバル変数があります - それとグローバル関数「isPrime()」を持つことはできません

cout の場合、「iostream」を含める必要があります

于 2013-09-27T17:18:01.090 に答える
0

まず、CreateThread特定の署名が必要です (参照):

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;
}
于 2013-09-27T17:31:03.667 に答える