Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的螺纹加工错误?_C_Multithreading - Fatal编程技术网

C中的螺纹加工错误?

C中的螺纹加工错误?,c,multithreading,C,Multithreading,我编译了这段代码,创建它的第99个线程不断创建多个编号为99的线程。相反,如果我插入1-10或更小的值,那么结果是非常正常的 这是代码 #include <stdio.h> #include <pthread.h> #include <unistd.h> pthread_mutex_t m=PTHREAD_MUTEX_INITIALIZER; pthread_attr_t attr; void* test(void *a) { int i=*((i

我编译了这段代码,创建它的第99个线程不断创建多个编号为99的线程。相反,如果我插入1-10或更小的值,那么结果是非常正常的

这是代码

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

pthread_mutex_t m=PTHREAD_MUTEX_INITIALIZER;
pthread_attr_t attr;

void* test(void *a)
{
    int i=*((int *)a);
    printf("The thread %d has started.\n",i);
    pthread_mutex_lock(&m);
    usleep(10000);
    printf("The thread %d has finished.\n",i);
    pthread_mutex_unlock(&m);
    pthread_exit(NULL);

}

int main()
{
    int i=0,j=0;
    pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_JOINABLE);
    pthread_t thread[100];

    for (i=0;i<100;i++)
    {
        j=i;
        pthread_create(&thread[i],&attr,test,&j);

    }

    for (i=0;i<100;i++)
        pthread_join(thread[i],NULL);
    return 0;
}

为什么会发生这种情况?

每个线程都会向主线程中的相同堆栈位置(
j
)传递相同的指针。在没有进一步同步的情况下,在打印其值之前,每个线程将被调度并运行和访问
j
的时间未定义

有很多方法可以从每个线程打印出一个唯一的数字,包括

  • malloc在主线程中包含(或是)这个数字的结构。将其传递给子线程,然后子线程负责释放它
  • (下面由Brian Roche建议)声明一个100个整数的数组,值为0、1、2等。将不同数组项的地址传递给每个线程
  • 让每个线程锁定一个互斥锁,然后复制/增加一个全局计数器。互斥锁可以传递到线程或另一个全局线程中
  • 向每个线程传递一个信号量,一旦访问了该数字,就向它发送信号。在主线程中等待此信号量

  • 注意,选项3和4涉及线程的序列化启动。如果你经常这样做,那么运行多个线程就没有什么意义了

    你需要保留所有的资料

    int indexes[PTHREAD_COUNT];
    
    for (i=0;i<100;i++) {
        indexes[i] = i;
        pthread_create(&thread[i], &attr, test, &indexes[i]);
    }
    
    int索引[PTHREAD_COUNT];
    
    对于(i=0;i
    i
    是主代码中与
    j
    相同的地址,您在线程中睡眠30毫秒。因此,所有线程都有时间运行,直到第一次互斥调用,然后它们都停止(稍多)当然,主循环中的
    i
    现在是99,因为pthread\u join循环已经完成


    您需要有一个“j”值数组[假设您希望所有线程独立运行]。或者执行其他操作。这取决于您实际想要执行的操作。

    您正在传递与指向数据a的指针相同的内存位置(&j)

    当线程启动时,它们会打印出刚刚分配给j的值,看起来很正常


    但是,只有一个人得到了锁并进入了睡眠,所有其他人都因此被封锁。当噩梦结束时,记忆位置“a”,当然,有一个int值99。

    实际上……他只有一个int值j@BrianRoach同意。这就是我想说的。如果你让我知道我的答案中哪一部分引起了混乱,我会改写它。我想这主要是我的阅读理解:)虽然我不知道这将如何工作,除非你运行一个又一个线程,这。。。不会有用的。我建议使用一个数组来保存“id”,或者做一些简单的事情,只需将值赋给j,而不是将其作为一个数组进行解引用pointer@BillSkiadas我更新了我的答案,提到了在每个线程中获得唯一编号的一些方法。选项1是最快的方法。我并不想粗鲁,但如果你自己尝试,而不是让所有的代码都为你编写,你会学到更多。考虑到目前为止的注意事项,它应该很容易实现;在循环中。非常感谢!:)
    int indexes[PTHREAD_COUNT];
    
    for (i=0;i<100;i++) {
        indexes[i] = i;
        pthread_create(&thread[i], &attr, test, &indexes[i]);
    }