1.线程概述
线程是一个进程内的基本调度单位,也可以称为轻量级进程。线程是在共享内存空间中并发的多道执行路径,它们共享一个进程的资源,如文件描述和信号处理。因此,大大减少了上下文切换的开销。一个进程可以有多个线程,也就
是有多个线程控制表及堆栈寄存器,但却共享一个用户地址空间。
2.线程实现
线程创建pthread_create()
所需头文件#include
<pthread.h>
函数原型int
pthread_create
((pthread_t
*thread,
pthread_attr_t
*attr,
thread:线程标识符
attr:线程属性设置
start_routine:线程函数的起始地址
arg:传递给start_routine的参数
函数返回值
成功:0
出错:-1
线程退出pthread_exit()
所需头文件#include
<pthread.h>
函数原型void
pthread_exit(void
*retval)
函数传入值retval:pthread_exit()调用者线程的返回值,可由其他函数如pthread_join
来检索获取
等待线程退出并释放资源pthread_join()
所需头文件#include
<pthread.h>
函数原型int
pthread_join
((pthread_t
th,
void
**thread_return))
函数传入值
th:等待线程的标识符
thread_return:用户定义的指针,用来存储被等待线程的返回值(不为NULL时)
函数返回值
成功:0
出错:-1
代码举例
1.
#include<pthread.h>
2.
#include<stdio.h>
3.
#include<errno.h>
4.
5.
/*线程1*/
6.
void
thread1()
7.
{
8.
int
i=0
9.
10.
while(1)
11.
{
12.
printf(thread1:%d/n,i)
13.
if(i>3)
14.
pthread_exit(0)
15.
i++
16.
sleep(1)
17.
}
18.
}
19.
20.
/*线程2*/
21.
void
thread2()
22.
{
23.
int
i=0
24.
25.
while(1)
26.
{
27.
printf(thread2:%d/n,i)
28.
if(i>5)
29.
pthread_exit(0)
30.
i++
31.
sleep(1)
32.
}
33.
}
34.
35.
int
main()
36.
{
37.
pthread_t
t1,t2
38.
39.
/*创建线程*/
40.
pthread_create(&t1,NULL,(void
*)thread1,NULL)
41.
pthread_create(&t2,NULL,(void
*)thread2,NULL)
42.
/*等待线程退出*/
43.
pthread_join(t1,NULL)
44.
pthread_join(t2,NULL)
45.
return
0
46.
}
3同步与互斥
<1>互斥锁
互斥锁的 *** 作主要包括以下几个步骤。
•
互斥锁初始化:pthread_mutex_init
•
互斥锁上锁:pthread_mutex_lock
•
互斥锁判断上锁:pthread_mutex_trylock
•
互斥锁接锁:pthread_mutex_unlock
•
消除互斥锁:pthread_mutex_destroy
1.
#include<pthread.h>
2.
#include<stdio.h>
3.
#include<errno.h>
4.
5.
int
i=0/*共享变量*/
6.
pthread_mutex_t
mutex=PTHREAD_MUTEX_INITIALIZER/*互斥锁*/
7.
8.
void
thread1()
9.
{
10.
int
ret
11.
while(1)
12.
{
13.
14.
15.
ret=pthread_mutex_trylock(&mutex)/*判断上锁*/
16.
17.
if(ret!=EBUSY)
18.
{
19.
pthread_mutex_lock(&mutex)/*上锁*/
20.
printf(This
is
thread1:%d/n,i)
21.
i++
22.
pthread_mutex_unlock(&mutex)/*解锁*/
23.
}
24.
sleep(1)
25.
}
26.
}
27.
28.
void
thread2()
29.
{int
ret
30.
while(1)
31.
{
32.
33.
ret=pthread_mutex_trylock(&mutex)
34.
if(ret!=EBUSY)
35.
{
36.
pthread_mutex_lock(&mutex)
37.
printf(This
is
thread2:%d/n,i)
38.
i++
39.
pthread_mutex_unlock(&mutex)
40.
}
41.
sleep(1)
42.
}
43.
}
44.
int
main()
45.
{
46.
pthread_t
t1,t2
47.
pthread_mutex_init(&mutex,NULL)
48.
pthread_create(&t1,NULL,(void
*)thread1,NULL)
49.
pthread_create(&t2,NULL,(void
*)thread2,NULL)
50.
51.
pthread_join(t1,NULL)
52.
pthread_join(t2,NULL)
53.
54.
pthread_mutex_destroy(&mutex)
55.
return
0
56.
}
<2>信号量
未进行同步处理的两个线程
1.
#include<pthread.h>
2.
#include<stdio.h>
3.
#include<errno.h>
4.
5.
int
i=0
6.
void
thread1()
7.
{
8.
9.
while(1)
10.
{
11.
printf(This
is
thread1:%d/n,i)
12.
i++
13.
sleep(1)
14.
}
15.
}
16.
17.
18.
void
thread2()
19.
{
20.
21.
while(1)
22.
{
23.
printf(This
is
thread2:%d/n,i)
24.
i++
25.
sleep(1)
26.
}
27.
}
28.
29.
int
main()
30.
{
31.
pthread_t
t1,t2
32.
33.
pthread_create(&t1,NULL,(void
*)thread1,NULL)
34.
pthread_create(&t2,NULL,(void
*)thread2,NULL)
Linux 下多线程和多进程程序的优缺点,各自适合什么样的业务场景IBM有个家伙做了个测试,发现切换线程context的时候,windows比linux快一倍多。进出最快的锁(windows2k的 critical section和linux的pthread_mutex),windows比linux的要快五倍左右。当然这并不是说linux不好,而且在经过实际编程之后,综合来看我觉得linux更适合做high performance server,不过在多线程这个具体的领域内,linux还是稍逊windows一点。这应该是情有可原的,毕竟unix家族都是从多进程过来的,而 windows从头就是多线程的。
如果是UNIX/linux环境,采用多线程没必要。
多线程比多进程性能高?误导!
应该说,多线程比多进程成本低,但性能更低。
在UNIX环境,多进程调度开销比多线程调度开销,没有显著区别,就是说,UNIX进程调度效率是很高的。内存消耗方面,二者只差全局数据区,现在内存都很便宜,服务器内存动辄若干G,根本不是问题。
多进程是立体交通系统,虽然造价高,上坡下坡多耗点油,但是不堵车。
多线程是平面交通系统,造价低,但红绿灯太多,老堵车。
我们现在都开跑车,油(主频)有的是,不怕上坡下坡,就怕堵车。
高性能交易服务器中间件,如TUXEDO,都是主张多进程的。实际测试表明,TUXEDO性能和并发效率是非常高的。TUXEDO是贝尔实验室的,与UNIX同宗,应该是对UNIX理解最为深刻的,他们的意见应该具有很大的参考意义。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)