我正在从main函数创建一个线程A,它又生成另一个子线程B.我想使用dic['Test']['class'] = {}
dic['Test']['class']['section'] = 5
显式地将堆栈大小分配给线程A和B.
根据要求,父线程A的堆栈大小小于子线程B.
我很困惑,如果子线程的堆栈是从父线程的堆栈空间分配的,或者父线程和子线程的堆栈空间完全不同。
有人可以帮助我吗?
答案 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
。