如何验证线程创建(C程序)

时间:2017-04-03 23:54:50

标签: c multithreading pthreads

我正在创建一个程序,该程序需要n个指定的线程,每个线程都充当一个" mole" (我正在制作打击鼹鼠)。现在..我想我有一些能做到这一点,但我不相信我的印刷语句实际上证实我有不同的线程......我怎么知道这有用呢?

我的代码如下:

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

int k = 0;

void* thread_function()
{
    k++;
    printf("Mole #%d\n", k);
}

int main(int argc,char *argv[])
{
    int mole_count= atoi(argv[1]);
    pthread_t thread_id[mole_count];
    int i;

    for(i=0;i<mole_count;i++)
    {
        pthread_create (&thread_id[i], NULL , &thread_function, NULL);

    }  

    for(i=0;i<mole_count;i++){
        pthread_join(thread_id[i],NULL);   
    }

    return 0;
}

由于

1 个答案:

答案 0 :(得分:0)

成功时pthread_create()函数将返回0,因此您知道线程是否已成功创建。 (之后发生的事情显然取决于线程函数本身。)

进程中的每个线程都有一个与之关联的唯一ID(就像操作系统中的所有进程都有一个唯一的进程iD一样)。您可以通过调用pthread_t pthread_self()来查询线程的ID。因此,您可以在每个线程函数中打印出这个任意但唯一的值,显示每个不同的线程在运行。

请注意,您的计数器k已共享,但不受互斥锁保护。由于它在每个线程中都被更新(读取 - 修改 - 更新),因此可能存在竞争条件,从而导致错误行为。使用原子变量来避免这些问题。

此外,您的线程函数应返回NULL,因为它的返回类型为void*

现在解释了所有这些,我不确定“whack-a-mole”游戏是多线程的好选择。线程可能非常有用,但带来了它们自身的复杂性。例如,如何在线程之间进行通信,维护共享状态以及协调事件?线程也可以使调试变得更加困难。考虑采用循环方法的简单设计。