gdb如何调试多线程呢??之前写了一个同步异步的例子,因为对异步来说通常采用的机制有两种,一是轮询,就是说每隔一段时间就过来询问一下,如果有就调用,对于这个机制,epoll比较适合,另一个就是回调,也就是说当我准备好了后直接通知你,基于这个,今天就顺着昨天的例子增加一些函数来理解异步回调,同时学习基础的gdb调试多线程。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
typedef void (*CBK_FUN)();
struct CBK_CALL{
void *data;
CBK_FUN fn;
};
void printSync(const char *str)
{
sleep(1); // assume this will do lots of thing
puts(str);
sleep(1); // assume this also will do lots of thing
}
void *thread_proc(void *data)
{
struct CBK_CALL *cbk_call = data;
sleep(1);
puts((char *)(cbk_call->data));
sleep(1);
cbk_call->fn(data);
return (void *)0;
}
pthread_t tid;
void printAsync(const char *str, CBK_FUN fn)
{
struct CBK_CALL cbk_call = {(void *)str, fn};
pthread_create(&tid, NULL, thread_proc, (void *)(&cbk_call));
}
void callback()
{
puts("After Sync Call");
}
int main()
{
printSync("I am Sync call");
printAsync("I am a Async call", callback);
puts("end");
pthread_join(tid, NULL);
return 0;
}
程序比较简单,基本思想就是先执行先同步输出, 接着printAsync会异步执行,且执行完后会回调callback函数,可是由于粗心大意,编译运行发现一直不成功,没办法,上gdb
# gdb a.out
(gdb) b printAsync // 函数断点, 输入print后按tab和Linux效果一样
Breakpoint 1 at 0x400696: file error.c, line 31.
(gdb) s &n