使用循环在C中创建线程?

时间:2017-11-19 21:03:54

标签: c multithreading

int main()
{
    pthread_attr_t attr;
    int policy = SCHED_FIFO;

    // sets scheduling policies of threads to FIFO
    pthread_attr_init(&attr);
    pthread_attr_setschedpolicy(&attr, policy);

    // creates 3 threads
    int ret;
    for (int i = 0; i < MAX_THREAD; i++)
    {
        ret = pthread_create(&(g_threadInfo[i].threadID), &attr, &thread_func, &g_threadInfo[i].arg);

        if (ret != 0)
        {
            printf("Create thread failed! Error %d", ret);
        }

        printf("Thread %d created!\n", (i + 1));
    }

    for (int i = 0; i < MAX_THREAD; i++)
    {
        pthread_join(g_threadInfo[i].threadID, NULL);
    }

    return 0;
}

// purpose: function for created threads
// parameters: pointer for thread variable
// returns: void pointer
void* thread_func (void* ptr)
{
    int i, sum;
    int offset = *(int *) ptr;
    for (i = 0; i < 1000; i++)
    {
        pthread_mutex_lock(&mutex);
        sum += offset;
        pthread_mutex_unlock(&mutex);
    }

    printf("%d\n", sum);
    pthread_exit(NULL);
}

我要做的是使用FIFO策略创建3个独立的线程。当我运行程序时,这是我得到的输出:

线程1已创建!

线程2已创建!

线程3已创建!

-866347832

0

0

理想情况下,我希望输出如下:

线程1已创建!

499500

线程2已创建!

499500

线程3已创建!

499500

以下是一些变量和在调用main之前初始化的结构。

typedef struct
{
    int threadNum;
    pthread_t threadID;
    int arg;
} threadInfo;

threadInfo g_threadInfo[MAX_THREAD];
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER

这是我第一次使用循环创建线程,所以我猜这会是问题吗?非常感谢帮助或指示。

1 个答案:

答案 0 :(得分:1)

似乎调用线程创建另一个线程的速度更快,而前一个线程仍处于1000次循环中。所以事实上,它不会影响程序本身,它仍然有效但是除非你在创建另一个线程之前等待前一个线程完成,否则你的输出将不会对应,但如果你这样做就像单线程程序一样。