使用setjump loopjump在线程中跳转的问题
使用setjump loopjump在线程中跳转的问题
使用setjump到另一个线程中跳转,跳转成功了,后面的代码不执行了
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include<setjmp.h>
jmp_buf buf;
void *print_a(void *);
void *print_b(void *);
//线程A方法
void *print_a(void *a) {
for (int i = 0; i < 5; ++i) {
sleep(1);
printf("aaaa \n");
int jmpret = setjmp(buf);
if (!jmpret) {
printf("!jmpret \n");
} else {
printf("继续执行线程1\n");
}
}
return NULL;
}
//线程B方法
void *print_b(void *b) {
for (int i = 0; i < 5; ++i) {
sleep(1);
printf("bbbb \n");
if (i == 3) {
printf("进入线程2 \n");
longjmp(buf, 1);
}
}
return NULL;
}
int main() {
pthread_t t0;
pthread_t t1;
//创建线程A
if (pthread_create(&t0, NULL, print_a, NULL) == -1) {
printf("fail to create pthread t0 \n");
exit(1);
}
if (pthread_create(&t1, NULL, print_b, NULL) == -1) {
printf("fail to create pthread t1 \n");
exit(1);
}
//等待线程结束
void *result;
if (pthread_join(t0, &result) == -1) {
printf("fail to recollect t0 \n");
exit(1);
} else {
printf("t0 success \n");
}
if (pthread_join(t1, &result) == -1) {
printf("fail to recollect t1 \n");
exit(1);
} else {
printf("t1 success \n");
}
getchar();
return 0;
}
主线程的getchar也不执行了
这是为何?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
讲真,我没想到还能这么用....
当线程
b
通过 longjmp跳到print_a
时,它的栈帧和线程a
的栈帧所在的内存就是一个地方了 (原来栈的内存没人管)。当线程a
退出时,自然要弹出所有栈帧,那么线程b
之后对栈访问就是对非法内存的访问了。就像你把双胞胎中的弟弟的头嫁接到哥哥身上,哥哥变成了连体婴儿,哥哥挂掉之后,弟弟也活不成了,反之也是
longjmp 不能跨线程。
C11 7.13.2.1 / 2: