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

标签 c multithreading pthreads

我正在创建一个程序,需要 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/

相关文章:

c - pthread API 是否在多处理器环境中提供同步?

linux - 我怎样才能实现快速障碍?

c++ - C/C++ : libcurl + extended ASCII chars = bad Google Translation API result

c - 如何防止 Windows WriteConsole() 默认使用宽字符

c - 相等或不重叠

linux - "threads"如何获取CPU和时间片?

c++ - 在主线程中填充数据时从结构数组的较低索引元素读取是否线程安全

c++ - fork() 除了执行外部程序之外的用处

c - 与 pthread_create 不兼容的指针类型 (C)

c - mongodb c-api 中的 $exists 查询