gpt4 book ai didi

c - Linux克隆 "kills"主线程

转载 作者:行者123 更新时间:2023-11-30 19:35:50 25 4
gpt4 key购买 nike

尝试在Linux上用C实现线程(显然是使用clone()),但我遇到了一个奇怪的问题。

首先,这是我的互斥函数:

void mutex_lock(int* lock) {
while (!__sync_bool_compare_and_swap(lock, 0, 1)) {
syscall(SYS_futex, lock, FUTEX_WAIT_PRIVATE, 1, NULL, NULL, 0);
}
}

void mutex_unlock(int* lock) {
if (__sync_bool_compare_and_swap(lock, 1, 0)) {
syscall(SYS_futex, lock, FUTEX_WAKE_PRIVATE, 0, NULL, NULL, 0);
}
}

还有我的线程结构

typedef int (*ThreadCallback)(void*);

typedef struct Thread {

void* alloc;

char lockSpace[sizeof(int) * 2]; /* Used to align lock pointer properly */
int* lock;
int started;
int tid;

void* stack;
size_t stackSize;

ThreadCallback fn;
void* args;

}* Thread;

在我的代码中,我分配并初始化一个稍后将使用的 Thread 结构

void* start = memAllocThread(sizeof(void*) + sizeof(struct Thread) + TH_STACK_SIZE);
if (start == NULL) {
return TH_MEM;
}

struct Thread* th = start + TH_STACK_SIZE + sizeof(void*);
th->alloc = start;

size_t lockSpacePtr = (size_t)(th->lockSpace);
lockSpacePtr += 4 - ((lockSpacePtr % 4) % 4); /* To align ptr on? at? 4 bytes */

th->lock = (int*)lockSpacePtr;
*th->lock = 0;
th->started = 0;

th->stack = start + TH_STACK_SIZE;
th->stackSize = TH_STACK_SIZE;

th->fn = fn;
th->args = args;

其中“TH_STACK_SIZE”、“fn”和“args”分别为“0x7fff”、“ThreadCallback”和“void*”

现在我已经初始化了 Thread 结构,并用一个输入 channel 和零个输出 channel 初始化了 PortAudio 和默认流。然后我开始我的线程

THResult thStart(struct Thread* th) {

int tid;

mutex_lock(th->lock);

if (th->started) {
mutex_unlock(th->lock);
return TH_RUNNING;
}

tid = clone(_thFunction, th->stack, CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_IO | CLONE_SIGHAND | CLONE_THREAD, th);

if (tid < 0) {
mutex_unlock(th->lock);
return TH_CLONE_ERRNO;
}

th->started = 1;
th->tid = tid;

mutex_unlock(th->lock);
return TH_OK;
}

“int _thFunction(void*)”当前为空(填充后应该从th->fn开始,但这里没有问题)

现在,在调用 Pa_StartStream() 之后,我可以编写任何我想要的内容,但它不会被执行(顺便说一句,如果我在代码中传播一些内容,printf 就会变得疯狂)。

  • 尝试追踪分段违规行为
  • 我删除了 Pa_StartStream :它有效,但 printf 仍然太狂野
  • 我删除了线程的开头,一切都很好

有什么想法吗?

编辑1:

  • 当创建的线程结束时,程序结束
  • gdb 对此只字未提,我尝试进行故障分析来分析堆栈,但没有任何问题

最佳答案

在解决这个问题时,有两件事很突出。

1) 尝试从临时克隆调用 printf。很可能存在标准库垃圾。

2) 仅提供 4k 堆栈。

printf(...) 替换为 write(2, ...) 调用,看看是否会获得更好的行为。您的手仍然会感到头痛,但它不会立即从您身下掉下来。

或者尝试gdb

exit() 退出所有线程。也许您需要以其他方式退出。从生成的线程函数返回是一个坏主意,因为这会破坏主线程的堆栈。

关于c - Linux克隆 "kills"主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41992523/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com