在单独的线程中查找素数

时间:2014-09-29 00:12:31

标签: c++ multithreading

我接到了一项任务。

编写输出素数的多线程Java,Pthreads或Win32程序。这个 程序应该如下工作:

  1. 用户将运行程序并在命令行中输入一个数字。
  2. 然后程序将创建一个输出所有素数的单独线程 小于或等于用户输入的数字。

  3. #include <windows.h>
    #include <iostream>
    #define MAX_THREADS 1
    using namespace std;
    
    DWORD WINAPI Prime (LPVOID);
    HANDLE hThreads [MAX_THREADS];
    DWORD id [MAX_THREADS];
    DWORD waiter;
    
    DWORD WINAPI Prime(LPVOID Param)
    {
        DWORD Number = *(DWORD*)Param;
        for (DWORD i=0;i<=Number;i++)
        {
            if((Number%2==0) ||(Number%3==0) || (Number%4==0)||(Number%5==0)||(Number%6==0)||  (Number%7==0)||(Number%8==0)||(Number%9==0))
            cout <<"";
            else
            cout<<i;
        }
        return 0;
    }
    
    int main(int argc, char* argv[ ])
    {
        DWORD ThreadId;
        HANDLE ThreadHandle;
        int Param;
    
        cout<<"Enter a number:";
        cin>>Param;
    
        cout<<"Prime numbers less than and equal to your number";
    
        ThreadHandle=CreateThread(NULL,0,Prime,&Param,0,&ThreadId);
    
        waiter=WaitForMultipleObjects(MAX_THREADS,hThreads,TRUE,INFINITE);
    
        for(int i=0;i<MAX_THREADS;i++)
            CloseHandle(hThreads[i]);
    
        system ("pause");
        return 0;
    }
    

    我一直在使用我在课堂上学到的东西来研究这个程序,但我似乎无法使我的程序工作。如果有人可以帮我清理我的程序并帮助我将其付诸实践,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

因为您通过所有整数在2到9之间检查可分性,所以您的程序不会报告任何小于11的素数。并且i仅用于循环打印,并且根本没有用于寻找素数。

答案 1 :(得分:0)

检查素数的方法是错误的!我添加了一个检查素数的函数

    #include <windows.h>
    #include <iostream>
    #define MAX_THREADS 1
    using namespace std;
    DWORD WINAPI Prime (LPVOID);
    HANDLE hThreads [MAX_THREADS];
    DWORD id [MAX_THREADS];
    DWORD waiter;
    int check_prime(int a)
    {
       int c;
       for ( c = 2 ; c <= a - 1 ; c++ )
       { 
          if ( a%c == 0 )
            return 0;
       }
       if ( c == a )
          return 1;
    }
    DWORD WINAPI Prime(LPVOID Param)
    {
        DWORD Number = *(DWORD*)Param;
        for (DWORD i=2;i<=Number;i++)
        {
            if(check_prime(i)==0)
                cout <<"";
            else
                cout<<i;
        }
        return 0;
    }
    int main(int argc, char* argv[ ])
    {
        // same your code
        return 0;
    }