我们在前面文章中已经分析了多线程VS多进程,也分析了线程的使用,现在我们来讲解一下linux多线程编程之同步与互斥。
现在,我们不管究竟是多线程好还是多进程好,先讲解一下,为什么要使用多线程?
一、 为什么要用多线程技术?
1、避免阻塞,大家知道,单个进程只有一个主线程,当主线程阻塞的时候,整个进程也就阻塞了,无法再去做其它的一些功能了。
2、避免CPU空转,应用程序经常会涉及到RPC,数据库访问,磁盘IO等操作,这些操作的速度比CPU慢很多,而在等待这些响应时,CPU却不能去处理新的请求,导致这种单线程的应用程序性能很差。
3、提升效率,一个进程要独立拥有4GB的虚拟地址空间,而多个线程可以共享同一地址空间,线程的切换比进程的切换要快得多。
二、 如何使用多线程技术进行编程?
下面给出个多线程程序,一个最简单的模拟售票系统,代码如下:
- #include <stdio.h>
- #include <pthread.h>
- void *ticketsell1(void *);
- void *ticketsell2(void *);
- int tickets = 20;
- int main()
- {
- pthread_t id1,id2;
- int error;
- error = pthread_create(&id1, NULL, ticketsell1, NULL);
- if(error != 0)
- {
- printf("pthread is not created!\n");
- return -1;
- }
- error = pthread_create(&id2, NULL, ticketsell2, NULL);
- if(error != 0)
- {
- printf("pthread is not created!\n");
- return -1;
- }
- pthread_join(id1,NULL);
- pthread_join(id2,NULL);
- return 0;
- }
- void *ticketsell1(void *arg)
- {
- while(1)
- {
- if(tickets > 0)
- {
- // usleep(1000);
- printf("ticketse1 sells ticket:%d\n",tickets--);
- }
- else
- {
- break;
- }
- }
- return (void *)0;
- }
- void *ticketsell2(void *arg)
- {
- while(1)
- {
- if(tickets > 0)
- {
- // usleep(1000);
- printf("ticketse2 sells ticket:%d\n",tickets--);
- }
- else
- {
- break;
- }
- }
- return (void *)0;
- }
执行结果如下:
- fs@ubuntu:~/qiang/mthread$ ./mthread1
- ticketse2 sells ticket:20
- ticketse2 sells ticket:19
- ticketse2 sells ticket:18
- ticketse2 sells ticket:17
- ticketse2 sells ticket:16
- ticketse2 sells ticket:15
- ticketse2 sells ticket:14
- ticketse2 sells ticket:13
- ticketse2 sells ticket:12
- ticketse2 sells ticket:11
- ticketse2 sells ticket:10
- ticketse2 sells ticket:9