我正在创建一个程序,该程序需要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;
}
由于
答案 0 :(得分:0)
成功时pthread_create()
函数将返回0,因此您知道线程是否已成功创建。 (之后发生的事情显然取决于线程函数本身。)
进程中的每个线程都有一个与之关联的唯一ID(就像操作系统中的所有进程都有一个唯一的进程iD一样)。您可以通过调用pthread_t pthread_self()
来查询线程的ID。因此,您可以在每个线程函数中打印出这个任意但唯一的值,显示每个不同的线程在运行。
请注意,您的计数器k
已共享,但不受互斥锁保护。由于它在每个线程中都被更新(读取 - 修改 - 更新),因此可能存在竞争条件,从而导致错误行为。使用原子变量来避免这些问题。
此外,您的线程函数应返回NULL
,因为它的返回类型为void*
。
现在解释了所有这些,我不确定“whack-a-mole”游戏是多线程的好选择。线程可能非常有用,但带来了它们自身的复杂性。例如,如何在线程之间进行通信,维护共享状态以及协调事件?线程也可以使调试变得更加困难。考虑采用循环方法的简单设计。