lunux多线程编程
1.进程与线程
1)用户空间角度:
进程:fork()创建进程,在创建时,重新申请了内存空间,copy了父进程的所有信息。
线程:pthread_create()创建进程时,只申请自己的栈空间。
2)内核空间:
对内核空间,两者都有自己的pid,因此内核空间不区分。
2.基本函数:
1)创建线程:
#include <pthread.h>
extern in t pthread_create(pthread_t *tidp,
const
pthread_attr_t *attr,
(
void
*)(*start_rtn)(
void
*),
void
*arg
)
第1个参数: 线程id
第2个参数:用来设置线程属性,通常为NULL
第3个参数:需要创建线程的执行代码地址
第4个参数:线程执行参数
pthread.h支持的是POSIX,编译时加-lpthread
#include<stdio.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/syscall.h>
struct data{
int i;
int j;
};
void *hello(struct data *str)
{
printf("child, the tid=%lu, pid=%ld\n",pthread_self(),syscall(SYS_gettid));
printf("arg.i=%d\narg.j=%d \n",str->i,str->j);
sleep();
} int main(int agrc,char *agrv[])
{
struct data test;
pthread_t thread_id;
test.i=;
test.j=;
pthread_create(&thread_id,NULL,(void*)*hello,&test);
printf("parent, the tid=%lu,pid=%ld\n",pthread_self(),syscall(SYS_gettid));
pthread_join(thread_id,NULL);
}
2)线程退出:
extern void pthread_exit(void *_retval),参数为线程取消状态。
int pthread _cancel(pthread_t thread)
线程取消的清理:
int pthread_cleanup_push(void (*routine)(void*),void *arg)
int pthread_cleanup_pop(int execute)
#include<pthread.h>
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h> void cleanup()
{
printf("cleanup\n");
}
void *test_cancel(void)
{
pthread_cleanup_push(cleanup,NULL);
printf("test_cancel\n");
while()
{
printf("test message\n");
sleep();
}
pthread_cleanup_pop();
}
int main()
{
pthread_t tid;
pthread_create(&tid,NULL,(void *)test_cancel,NULL);
sleep();
pthread_cancel(tid);
pthread_join(tid,NULL); // pthread_join()等待线程执行
}
3)线程与私有数据:
int pthread_key_create(pthread_key_t *key, void (*destructor)(void*)) //创建私有数据
int pthread_key_delete(pthread_key_t key) //删除私有数据
int pthread_setspecific(pthread_key_t key,const void *pointer) //读,pointer是与key相关联的
int pthread_getspecific(pthread_key_t key) //写
3.互斥锁:以排他的方式防止共享数据并发的访问
1)初始化:
#include <pthread.h>
int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr)
第1个参数:所要指向的互斥锁指针
第2个参数:指向属性对象的指针,如NULL使用默认属性
2)申请互斥锁:
int pthread_mutex_lock(pthread_mutex_t *mutex) //阻塞方式申请
int pthread_mutex_trylock(pthread_mutex_t *mutex) //非阻塞方式申请
3)释放互斥锁:
int pthread_mutex_unlock(pthread_mutex_t *mutex)
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <string.h> void *thread_function(void *arg); pthread_mutex_t work_mutex; #define WORK_SIZE 1024
char work_area[WORK_SIZE];
int time_to_exit = ; int main(int argc,char *argv[])
{
int res;
pthread_t a_thread;
void *thread_result;
res = pthread_mutex_init(&work_mutex, NULL); //init mutex
if (res != )
{
perror("Mutex initialization failed");
exit(EXIT_FAILURE);
}
res = pthread_create(&a_thread, NULL, thread_function, NULL);//create new thread
if (res != )
{
perror("Thread creation failed");
exit(EXIT_FAILURE);
}
pthread_mutex_lock(&work_mutex); //lock the mutex
printf("Input some text. Enter 'end' to finish\n");
while(!time_to_exit)
{
fgets(work_area, WORK_SIZE, stdin); //get a string from stdin
pthread_mutex_unlock(&work_mutex); //unlock the mutex
while()
{
pthread_mutex_lock(&work_mutex); //lock the mutex
if (work_area[] != '\0')
{
pthread_mutex_unlock(&work_mutex); //unlock the mutex
sleep();
}
lunux多线程编程的更多相关文章
- Web Worker javascript多线程编程(一)
什么是Web Worker? web worker 是运行在后台的 JavaScript,不占用浏览器自身线程,独立于其他脚本,可以提高应用的总体性能,并且提升用户体验. 一般来说Javascript ...
- Web Worker javascript多线程编程(二)
Web Worker javascript多线程编程(一)中提到有两种Web Worker:专用线程dedicated web worker,以及共享线程shared web worker.不过主要讲 ...
- windows多线程编程实现 简单(1)
内容:实现win32下的最基本多线程编程 使用函数: #CreateThread# 创建线程 HANDLE WINAPI CreateThread( LPSECURITY_ATTRIBUTES lpT ...
- Rust语言的多线程编程
我写这篇短文的时候,正值Rust1.0发布不久,严格来说这是一门兼具C语言的执行效率和Java的开发效率的强大语言,它的所有权机制竟然让你无法写出线程不安全的代码,它是一门可以用来写操作系统的系统级语 ...
- windows多线程编程星球(一)
以前在学校的时候,多线程这一部分是属于那种充满好奇但是又感觉很难掌握的部分.原因嘛我觉得是这玩意儿和编程语言无关,主要和操作系统的有关,所以这部分内容主要出现在讲原理的操作系统书的某一章,看完原理是懂 ...
- Java多线程编程核心技术---学习分享
继承Thread类实现多线程 public class MyThread extends Thread { @Override public void run() { super.run(); Sys ...
- python多线程编程
Python多线程编程中常用方法: 1.join()方法:如果一个线程或者在函数执行的过程中调用另一个线程,并且希望待其完成操作后才能执行,那么在调用线程的时就可以使用被调线程的join方法join( ...
- 浅述WinForm多线程编程与Control.Invoke的应用
VS2008.C#3.0在WinForm开发中,我们通常不希望当窗体上点了某个按钮执行某个业务的时候,窗体就被卡死了,直到该业务执行完毕后才缓过来.一个最直接的方法便是使用多线程.多线程编程的方式在W ...
- Java—多线程编程
一个多线程程序包含两个或多个能并发运行的部分.程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径. 进程:一个进程包括由操作系统分配的内存空间,包含一个或多个线程.一个线程不能独立的存 ...
随机推荐
- 'com.alibaba.fastjson.support.spring.FastJsonpResponseBodyAdvice' is。。。。
com.alibaba.fastjson版本1.2.43版本在通过xml方式配置spring的时候会出现这个个奇怪的问题: Class 'com.alibaba.fastjson.support.sp ...
- ScrollBarsEnabled的使用
在WinForm中通过WebBrowser获取网页,我想把WebBrowser的ScollBar去掉,我的网页不需要滚动条. 设置方法如下:单击WebBrowser设计页面,在属性页面有一个Scrol ...
- Educational Codeforces Round 53 Div. 2翻车记
A:差点开场懵逼.只要有相邻两位不同就可以作为答案. #include<iostream> #include<cstdio> #include<cmath> #in ...
- [NOIP2017 TG D2T2]宝藏
题目大意:给定一个有重边,边有权值的无向图.从某一个点出发,求到达所有的点需要的最少费用,并且限制两点之间只有一条路径.费用的计算公式为:所有边的费用之和.而边$x->y$的费用就为:$y$到初 ...
- [洛谷P2384]最短路
题目大意:给你一个图,要你求出其中1->n路径中乘积最小的一条路 题解:用$log_2$把乘法变成加法,然后记录每个点的前驱,最后求出答案 C++ Code: #include<cstdi ...
- 2018牛客多校第一场 A.Monotonic Matrix
题意: 给一个n*m的矩阵赋值(0,1,2).使得每个数都不小于它左面和上面的数. 题解: 构建0和1的轮廓线.对于单独的轮廓线,共需要往上走n步,往右走m步.有C(n+m,n)种方式. 两个轮廓线的 ...
- 51nod1254 最大子段和 V2 DP
---题面--- 题解: 表示今天做题一点都不顺.... 这题也是看了题解思路然后自己想转移的. 看的题解其实不是这道题,但是是这道题的加强版,因为那道题允许交换k对数. 因为我们选出的是连续的一段, ...
- MFC随机数
void CMFCDemoDlg::OnClickedGetrand() { wchar_t str[]; //srand((unsigned)time(NULL)); int num = rand( ...
- bzoj1814 Ural 1519 Formula 1(插头dp模板题)
1814: Ural 1519 Formula 1 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 924 Solved: 351[Submit][Sta ...
- idea初学建立maven项目报错
原理,是因为你没把新创建好的maven项目给设置成一个可被tomcat部署的web项目 参考此博文,讲的非常详细: 归根到底是因为web项目的部署问题: 解决方案:在创建的到时候,idea下部会提示是 ...