我正在创建一个程序,需要 n 个指定的线程,每个线程都充当一个“地鼠”(我正在打地鼠)。现在..我想我有一些东西可以做到这一点,但我不相信我的打印语句实际上验证了我有n个不同的线程...我到底如何知道这已经起作用了?
我的代码如下:
#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;
}
谢谢
最佳答案
pthread_create()
函数成功时将返回 0,因此您可以知道线程是否已成功创建。 (显然,之后发生的事情取决于线程函数本身。)
进程中的每个线程都有一个与其关联的唯一 ID(就像操作系统中的所有进程都有一个唯一的进程 ID 一样)。您可以通过调用pthread_t pthread_self()
查询线程的ID。因此,您可以在每个线程函数中打印出这个任意但唯一的值,向您显示每个不同的线程正在运行。
请注意,您的计数器 k
是共享的,但不受互斥锁的保护。由于它在每个线程中更新(读取-修改-更新),因此可能会出现竞争条件,从而导致错误行为。使用原子变量可以避免这些问题。
此外,您的线程函数应返回 NULL
,因为它的返回类型为 void*
。
现在已经解释了所有这些,我不确定“打地鼠”游戏是否适合多线程。线程非常有用,但也带来了自身的复杂性。例如,如何在线程之间进行通信、维护共享状态以及协调事件?线程还会使调试变得更加困难。首先考虑采用循环方法的更简单的设计。
关于c - 如何验证线程创建(C 程序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43196174/