如何计算每个线程找到的素数数量 Ubuntu?

how do I count the amount of prime numbers each thread has found Ubuntu?

我创建了一个系统,该系统使用用户定义的线程数来计算从 1 到 10000 的引数我想找出每个线程找到了多少并在最后输出而不是打印每个素数。我想出了如何计算找到的质数总数(下面的代码)但不知道如何计算每个单独的线程。任何帮助表示赞赏。


#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

int gretval = 0;
struct threadArgs
{
    int start;
    int finish;
};

void *threadMain(void *p)
{
    struct threadArgs *pargs = p;
    int i, c;
    int nstart = pargs->start, nfinish = pargs->finish;
    pthread_t tid = pthread_self();

    for (i = nstart; i < nfinish; i++)
    {
        for (c = 2; c <= i - 1; c++)
        {
            if (i % c == 0)
                break;
        }
        if (c == i)
            gretval = gretval + 1;
        //printf("thread %ld : %d\n",tid,i);
    }
    pthread_exit(&gretval);
    return 0;
}

void main(int argc, char **argv)
{
    void *pretval1;
    int retval;
    int numThreads = 0;
    int i;
    printf("how many threads would you like to use?\n");
    scanf("%d", &numThreads);
    pthread_t thrID[100];
    struct threadArgs targs[100];

    if (argc > 1)
    {
        numThreads = atoi(argv[1]);
    }
    if (numThreads > 0 && numThreads <= 100)
    {
        int chunkSize = 10000 / numThreads;
        for (i = 0; i < numThreads; i++)
        {
            targs[i].start = i * chunkSize;
            targs[i].finish = (i * chunkSize) + chunkSize;
            pthread_create(&thrID[i], NULL, threadMain, &targs[i]);
        }
        for (i = 0; i < numThreads; i++)
        {
            pthread_join(thrID[i], &pretval1);
        }
    }
    retval = *(int *)pretval1;
    printf("*pretval1 = %d\n", retval);
}

根据建议编辑代码

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
struct threadArgs{
    int start;
    int finish;
    int counter;
};

void *threadMain(void *p){
    struct threadArgs *pargs = p;
    int i,c
    ;
    int nstart = pargs -> start, nfinish = pargs -> finish, nCounter = ++pargs -> counter;
    pthread_t tid = pthread_self();
    
    for(i=nstart; i<nfinish; i++){
        for (c=2; c<= i-1; c++){
            if(i%c == 0)
                break;
            }
            if ( c == i)
                nCounter++;
                printf("thread %ld : %d : %d\n",tid,i,nCounter);


    }
    pthread_exit(&nCounter);
    return 0;
}

void main(int argc, char **argv){
    void *pretval1;
    int retval;
    int numThreads = 0;
    int i;
    printf("how many threads would you like to use?\n");
    scanf("%d", &numThreads);
    pthread_t thrID[100];
    struct threadArgs targs[100];
    
    if ( argc > 1){
        numThreads = atoi(argv[1]);
    }
    if (numThreads > 0 && numThreads <= 100){
        int chunkSize = 10000/numThreads;
        for (i=0; i<numThreads; i++){
            targs[i].start = i*chunkSize;
            targs[i].finish = (i*chunkSize)+chunkSize;
            targs[i].counter = 0;
            pthread_create(&thrID[i], NULL, threadMain, &targs[i]);
            }
            for (i=0; i<numThreads; i++){
                pthread_join(thrID[i], &pretval1);
            }
    }
    //nCounter = *(int *)pretval1;
    //printf("*pretval1 = %d\n", nCounter);

}

感谢@WhozCraig,我找到了问题的答案!发布以便关闭。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

struct threadArgs{
    int start;
    int finish;
    int counter;
};

void *threadMain(void *p)
{
    struct threadArgs *pargs = p;
    //int limit;
    for (int i = pargs->start; i < pargs->finish; i++)
    {
        int c;
        for (c = 2; c < i; ++c)
        {
            if (i % c == 0)
                break;
        }

        if (c == i)
            if(pargs -> counter <= 4){
            ++pargs->counter;
          } else {
            pthread_cancel(pthread_self());
          }

    }
    pthread_exit(p);
}

int main(int argc, char **argv)
{
    int numThreads = 0;
    printf("how many threads would you like?\n");
    scanf("%d",&numThreads);

    pthread_t thrID[100];
    struct threadArgs targs[100];

    if (argc > 1)
    {
        numThreads = atoi(argv[1]);
    }

    if (numThreads > 0 && numThreads <= 100)
    {
        int chunkSize = 10000 / numThreads;
        for (int i = 0; i < numThreads; ++i)
        {
            targs[i].start = i * chunkSize;
            targs[i].finish = (i + 1) * chunkSize;
            targs[i].counter = 0;
            pthread_create(&thrID[i], NULL, threadMain, targs+i);
        }

        for (int i = 0; i < numThreads; i++)
        {

                    pthread_join(thrID[i], NULL);
                    printf("Thread %d : %d primes\n", i, targs[i].counter);
        }
    }

    return EXIT_SUCCESS;
}