堆积儿童螺纹的空间

时间:2016-06-16 09:47:00

标签: c linux

我正在从main函数创建一个线程A,它又生成另一个子线程B.我想使用dic['Test']['class'] = {} dic['Test']['class']['section'] = 5 显式地将堆栈大小分配给线程A和B.

根据要求,父线程A的堆栈大小小于子线程B.

我很困惑,如果子线程的堆栈是从父线程的堆栈空间分配的,或者父线程和子线程的堆栈空间完全不同。

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

  

我想使用pthread_attr_setstacksize()显式地将堆栈大小分配给线程A和B.

所以,你这样做:

    $( document ).ready(function() {
      $('.mc-field-group').find('input').bind('focusout', function() {
        console.log($(this).parent().next('.mc-field-group').find('input').attr('id'));
        $(this).parent().next('.mc-field-group').find('input').addClass('test')
          });
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <div class="form-display">
          <div class="mc-field-group">
            <label for="mce-FNAME">First Name </label>
            <input type="text" value="" name="FNAME" class="" id="mce-FNAME">
          </div>
          <div class="mc-field-group">
            <label for="mce-EMAIL">Email Address </label>
            <input type="email" value="" name="EMAIL" class="required email" id="mce-EMAIL">
          </div>
          <div class="mc-field-group">
            <label for="mce-LastName">Last Name </label>
            <input type="email" value="" name="EMAIL" class="required email" id="mce-LastName">
          </div>
          <input type="submit" value="Subscribe" name="subscribe" id="mc-embedded-subscribe" class="button">
        </div>
  

根据要求,父线程A的堆栈大小小于子线程B。

只需确保尺寸是页面尺寸(sysconf(_SC_PAGESIZE))的倍数,并且至少为 $( document ).ready(function() { $('.mc-field-group').find('input').bind('focusout', function() { console.log($(this).parent().next('.mc-field-group').find('input').attr('id')); $(this).parent().next('.mc-field-group').find('input').addClass('test') }); });

没有父线程或子线程。他们都是兄弟姐妹&#34;属于同一个过程。有一个&#34;主线程&#34;,这是进程启动时唯一的线程,但它没有任何特殊之处。它的名称来自 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="form-display"> <div class="mc-field-group"> <label for="mce-FNAME">First Name </label> <input type="text" value="" name="FNAME" class="" id="mce-FNAME"> </div> <div class="mc-field-group"> <label for="mce-EMAIL">Email Address </label> <input type="email" value="" name="EMAIL" class="required email" id="mce-EMAIL"> </div> <div class="mc-field-group"> <label for="mce-LastName">Last Name </label> <input type="email" value="" name="EMAIL" class="required email" id="mce-LastName"> </div> <input type="submit" value="Subscribe" name="subscribe" id="mc-embedded-subscribe" class="button"> </div>,因为它是开始运行该函数的线程。根据哪个线程创建了一些其他线程并不重要。

如果某些代码中的线程之间存在父子关系,则它用于反映代码的逻辑,而不是线程&#39;实际关系。 &#34; Parent&#34; &#34; child&#34; 只是&#34;创建新创建的线程的简单缩写线程&#34; &#34;新创建的线程&#34;

进程确实有真正的父子关系 - 例如,只有父进程可以获得它的子进程 - 但是所有线程都是Linux中进程内的兄弟:任何线程都可以在同一进程中加入/收获任何其他线程

  

我很困惑,如果子线程的堆栈是从父线程的堆栈空间分配的,或者父线程和子线程的堆栈空间完全不同。

不,每个线程都有自己独立的堆栈。如果没有指定属性,这个新堆栈几乎总是由 pthread_attr_t attrs; pthread_t A, B; void *A_retval, *B_retval; int result; result = pthread_attr_init(&attrs); if (result) { fprintf(stderr, "Cannot initialize thread attributes: %s.\n", strerror(result)); exit(EXIT_FAILURE); } result = pthread_attr_setstacksize(&attrs, A_STACK_SIZE); if (result) { fprintf(stderr, "Cannot set stack size %zu for thread A: %s.\n", (size_t)A_STACK_SIZE, strerror(result)); exit(EXIT_FAILURE); } result = pthread_create(&A, &attrs, A_FUNCTION, NULL); if (result) { fprintf(stderr, "Cannot create thread A: %s.\n", strerror(result)); exit(EXIT_FAILURE); } result = pthread_attr_setstacksize(&attrs, B_STACK_SIZE); if (result) { fprintf(stderr, "Cannot set stack size %zu for thread B: %s.\n", (size_t)A_STACK_SIZE, strerror(result)); exit(EXIT_FAILURE); } result = pthread_create(&B, &attrs, B_FUNCTION, NULL); if (result) { fprintf(stderr, "Cannot create thread A: %s.\n", strerror(result)); exit(EXIT_FAILURE); } pthread_attr_destroy(&attrs); /* TODO: Perhaps this thread also does something? */ /* Wait for A and B to exit. */ result = pthread_join(A, &A_retval); if (result) fprintf(stderr, "Warning: Thread A: %s.\n", strerror(result)); result = pthread_join(B, &B_retval); if (result) fprintf(stderr, "Warning: Thread B: %s.\n", strerror(result)); 调用自动分配和准备,使用所需的堆栈大小,或者如果没有指定属性,则使用默认堆栈大小(巨大的,几兆字节)。

(有PTHREAD_STACK_MIN调用为使用该组属性创建的下一个线程设置显式堆栈。一些非常奇怪的应用程序可能需要特定的堆栈安排。堆栈区域不仅仅是一些随机块内存;它确实需要正确对齐,足够大等等。例如,可以使用main()自行分配它,但绝对不是你应该或者想要做的事情。 )

查看程序本身或某些特定进程使用的内存区域可能会很有趣或有用。

在Linux中,您的程序可以打开并读取pthread_create()伪文件(它不是磁盘上的真实文件,而是内核在打开并读取时动态生成的类文件实体),或者您可以阅读与流程ID pthread_attr_setstack()对应的任何mmap()

每行的前两个十六进制数字描述地址范围,堆栈标记为/proc/self/maps

有关/proc/PID/maps伪文件系统中文件的更多信息,请参阅man 5 proc