linux 中多线程使用
/*
* 对于线程之间的操作:
* 一个进程中会有多个线程,各个线程之间的或向切换会付出很小的代价相比于进程之间的切换
* 为什么要引入多线程:
* 1.与进程相比,他是一种非常节俭的多任务的操作方式。文们知道,在linux系统下,启动一个新的进程,
* 必须分配一个独立的地址空间,建立众多的数据表来维护它的代码段,堆栈段和数据段,这是一种开销和维护成本比较大的多任务工作方式。
* 而运行一个进程中的多个线程,他们彼此之间使用相同的地址空间,共享大部分的数据,启动一个线程花费的时间和空间远小于启动一个进程
* 所花费的空间;
* 2.线程间的通信比较方便,对于不同的进程来说,他们具有独立的数据空间,要进行数据传递只能以通信的方式进行,这种方式不仅费时,而且不方便
* 线程则不然,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其他线程所用。
* 3.提高应用程序的响应;
* 4.使多CPU系统更加有效,操作系统会保证当线程数不大于CPU数目时,不同的线程运行在不同的CPU上
* 5.改善程序结构,一个即长有复杂的进程,可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样程序便于理解和修改
* */ #include <pthread.h>
#include <sys/time.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/resource.h> #define MAX 10 pthread_t thread[2];
pthread_mutex_t mut;
int number = 0,i; void * thread1(void * )
{
printf("thread1 : I'm thread 1\n");
for(i=0; i<MAX; i++)
{
pthread_mutex_lock(&mut);
printf("thread1 : number = %d\n",number);
number++;
pthread_mutex_unlock(&mut);
msleep(1000*100);
}
printf("thread1 :wait the main thread to finish the task?\n");
pthread_exit(NULL);
} void * thread2(void * )
{
printf("thread2 : I'm thread 2\n");
for(i=0; i<MAX; i++)
{
pthread_mutex_lock(&mut);
printf("thread2 : number = %d\n",number);
number--;
pthread_mutex_unlock(&mut);
msleep(1000*100);
}
printf("thread2 :wait the main thread to finish the task?\n");
pthread_exit(NULL);
} void thread_create(void)
{
int temp;
memset(&thread,0,sizeof(thread));
temp = pthread_create(&thread[0],NULL,thread1,NULL);
if(temp != 0)
printf("create thread 1 failed\n");
else
printf("create thread 1 successful\n"); temp = pthread_create(&thread[1],NULL,thread2,NULL);
if(temp != 0)
printf("create thread 2 failed\n");
else
printf("create thread 2 successful\n");
} void thread_wait(void)
{
if(thread[0] != 0)
{
pthread_join(thread[0],NULL);
printf("thread 1 has finished \n");
}
if(thread[1] != 0)
{
pthread_join(thread[0],NULL);
printf("thread 2 has finished \n");
}
} int main()
{
pthread_mutex_init(&mut,NULL);
printf("I am the main thread\n");
thread_create();
printf("Main thread wait other thread run\n");
thread_wait();
return 0;
}
在我笔记本上的运行结果是:
I am the main thread
create thread 1 successful
create thread 2 successful
Main thread wait other thread run
thread2 : I'm thread 2
thread1 : I'm thread 1
thread2 : number = 0
thread1 : number = -1
thread2 : number = 0
thread1 : number = -1
thread2 : number = 0
thread1 : number = -1
thread1 : number = 0
thread2 : number = 1
thread2 : number = 0
thread1 : number = -1
thread2 : number = 0
thread1 : number = -1
thread1 : number = 0
thread2 : number = 1
thread2 :wait the main thread to finish the task?
thread1 :wait the main thread to finish the task?
thread 1 has finished
thread 2 has finished
linux 中多线程使用的更多相关文章
- linux中多线程解析
Linux系统下的多线程遵循POSIX线程接口,称为 pthread.编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a.顺便说一下,Linux ...
- Linux中多线程信号的处理
1. 博文:Linux多线程中使用信号-1 http://blog.csdn.net/qq276592716/article/details/7325250 2. 博文:Linux多线程信号总结 ...
- 【转】Linux中多线程wait使用注意
使用管道生成的while,是无法进行并发管理的 在处理日志的时候,采用管道多线程,怎么都实现不了wait功能,经上篇文章才知道,使用管道生成的while,无法进行并发管理. while read qu ...
- Linux中线程的挂起与恢复(进程暂停)
http://www.linuxidc.com/Linux/2013-09/90156.htm 今天在网上查了一下Linux中对进程的挂起与恢复的实现,相关资料少的可怜,大部分都是粘贴复制.也没有完整 ...
- Linux中查看进程的多线程
在SMP系统中,我们的应用程序经常使用多线程的技术,那么在Linux中如何查看某个进程的多个线程呢? 本文介绍3种命令来查看Linux系统中的线程(LWP)的情况: 在我的系统中,用qemu-syst ...
- Linux中查看进程的多线程pstree, ps -L
Linux中查看进程的多线程 在SMP系统中,我们的应用程序经常使用多线程的技术,那么在Linux中如何查看某个进程的多个线程呢? 本文介绍3种命令来查看Linux系统中的线程(LWP)的情况:在我的 ...
- linux 中 eclipse 开发 c/c++ 多线程程序,添加 libpthread.a 库支持
导入头文件 在 linux 中开发多线程程序,在使用到 pthread 系列函数的文件中,需要导入头文件: #include <pthread.h> 链接 libpthread.a 在编译 ...
- linux中c多线程同步方法
https://blog.csdn.net/jkx01whg/article/details/78119189 Linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量和信号量. 一.互斥 ...
- [转]Linux 的多线程编程的高效开发经验
Linux 平台上的多线程程序开发相对应其他平台(比如 Windows)的多线程 API 有一些细微和隐晦的差别.不注意这些 Linux 上的一些开发陷阱,常常会导致程序问题不穷,死锁不断.本文中我们 ...
随机推荐
- c++ 文件读写(转)
C/C++ code //创建一个文本文件并写入信息 //同向屏幕上输出信息一样将信息输出至文件 #include<iomanip.h> #include<fstream.h> ...
- Mybatis设置自增主键
useGeneratedKeys="true" keyProperty="id" 方法1: <insert id="insert" p ...
- 戏说Java多线程
戏说Java多线程. package com.cmp.chengfu.app.jdk6.desktop; import java.awt.Desktop; import java.io.File; i ...
- BootstrapTable+KnockoutJS
BootstrapTable+KnockoutJS实现增删改查解决方案(三):两个Viewmodel搞定增删改查 前言:之前博主分享过knockoutJS和BootstrapTable的一些基础用 ...
- QListWidget的QComboBox下拉列表添加复选框及消息处理
要在QComboBox下拉列表项中添加复选框,并进行消息处理,在网上搜索了很久没有找到太多有用的信息和实际的例子,但从中还是找到了一些提示性的资料,根据这些简短的介绍,最终实现了这个功能. QComb ...
- Java中synchronized注意点
之前一直以为 synchronized 加在方法前面就只有一个线程能访问了,项目中碰到一个问题,一个类的不同对象,同时访问加了 synchronized的方法 同样是可以访问的,那是因为 synchr ...
- linux环境变量配置总结
LD_LIBRARY_PATH: 动态库的查找路径设置:方法一: export LD_LIBRARY_PATH=LD_LIBRARY_PATH:/XXX 但是登出后就失效方法二: 修改~/.bash ...
- C++中搜索、截取字符串
演示样例中有具体凝视,直接上代码: #include <iostream> #include <string> using std::cout; using std::endl ...
- linux定时任务crontab的设置
linux定时任务crontab的设置http://www.blogjava.net/freeman1984/archive/2010/09/23/332715.html vi /etc/cronta ...
- List(双向链表)
List是一种双向链表结构,可以从第一个元素开始删除.插入,也可以从最后一个元素删除.插入,下面介绍一下 List 中常用的几个函数: 一.List 中的 begin 和 end 函数 : 和其他几种 ...