标准C语言无内置多线程支持,pthread是POSIX线程库,需链接-lpthread并包含;传参须确保生命周期覆盖线程全程;joinable线程需pthread_join或设为detached;共享变量必须用mutex保护,避免竞态与死锁。

标准 C 语言本身不提供多线程支持,pthread 是 POSIX 标准下的线程库,不是 C 语言内置功能,必须显式链接 -lpthread 且包含 。
pthread_create 启动线程时传参容易出错
常见错误是直接传栈变量地址,线程还没开始执行,主线程已退出该作用域,导致未定义行为。
- 传参必须确保生命周期覆盖整个线程运行期:用
malloc分配的堆内存、全局/静态变量,或主线程同步等待(如pthread_join)后再释放 - 不要写
pthread_create(&t, NULL, func, &local_var);改用int *p = malloc(sizeof(int)); *p = local_var; pthread_create(..., p); - 线程函数参数类型必须是
void *,接收后需强制转回原类型,例如int val = *(int *)arg;
线程退出后资源不自动清理
pthread_create 创建的线程默认是“可连接的(joinable)”,退出后内核保留其退出状态,直到另一线程调用 pthread_join。否则会泄漏资源,类似进程中的僵尸进程。
- 若不需要获取返回值,创建前设为分离态:
pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); pthread_create(&t, &attr, ...); - 或创建后立即分离:
pthread_detach(t);,但要确保t有效且未被join过 - 调用
pthread_join(t, &retval)会阻塞,直到t终止;retval可为NULL
多个线程读写同一变量必须加锁
C 语言没有原子操作保证(C11 是例外),普通 int counter++ 在多线程下不是原子的——它包含读、加、写三步,可能被中断并交错执行,结果不可预测。
新版本程序更新主要体现在:完美整合BBS论坛程序,用户只须注册一个帐号,即可全站通用!采用目前流行的Flash滚动切换广告 变换形式多样,受人喜爱!在原有提供的5种在线支付基础上增加北京云网支付!对留言本重新进行编排,加入留言验证码,后台有留言审核开关对购物系统的前台进行了一处安全更新。在原有文字友情链接基础上,增加LOGO友情链接功能强大的6种在线支付方式可选,自由切换。对新闻列表进行了调整,
立即学习“C语言免费学习笔记(深入)”;
- 用
pthread_mutex_t保护临界区:声明为全局或静态,用pthread_mutex_init初始化(或PTHREAD_MUTEX_INITIALIZER) - 每次访问共享变量前调用
pthread_mutex_lock,结束后立即pthread_mutex_unlock - 避免死锁:锁的获取顺序必须一致;不要在持有锁时调用可能阻塞或再次申请锁的函数(如
printf不推荐在锁内调用) - 注意:
static int counter;仍是共享的,即使声明在函数内
最常被忽略的是:忘记初始化互斥量、忘记销毁(pthread_mutex_destroy)、在 fork 后子进程中继续使用父进程创建的线程或锁——这些都会引发难以复现的崩溃或数据错乱。










