多线程的坑
有如下代码
1 |
|
分析
- 将for循环中的i,直接作为线程的入参,有什么问题吗?
直接将i作为入参,后面的几个线程都是使用同一个i变量。i后面的值会影响前面的值。需要使用新的变量作为入参才能满足使用要求。 - 多个线程对同一个变量进行操作需要加锁,使用volatile是无法避免的。必须使用锁才能保证数据不会出现冲突。
注意:这里的多线程是基于linux系统的,windows使用线程开发方式不一样。
windows 多线程开发
windows创建一个线程
1 |
|
Pthread内存泄露情况
1 | pthread_t pthread; |
valgrind检查出现泄露:
1 | 272 bytes in 1 blocks are possibly lost in loss record 34 of 44 |
原因分析:创建线程之后,没有释放pthread,需要使用pthread_detach
或者pthread_join
进行释放。
1 | pthread_t pthread; |
Pthread内存泄露情况
1 | pthread_t pthread; |
valgrind检查出现泄露:
1 | 272 bytes in 1 blocks are possibly lost in loss record 34 of 44 |
原因分析:创建线程之后,没有释放pthread,需要使用pthread_detach
或者pthread_join
进行释放。
1 | pthread_t pthread; |
使用detach
会剥离线程,只能等待线程释放自己的资源
使用pthread_join
会等待子线程退出,子线程阻塞也会等待。
使用pthread_cancel
会给子线程发送一个信号,这个信号会中断子线程,使其退出。
使用例子
1 |
|
C线程创建和退出
1 |
|
pthread_cancel
之后也可以使用pthread_join
,甚至也可以使用pthread_detach
之后再pthread_join。反正没啥用。