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多线程编程的更多相关文章

  1. Web Worker javascript多线程编程(一)

    什么是Web Worker? web worker 是运行在后台的 JavaScript,不占用浏览器自身线程,独立于其他脚本,可以提高应用的总体性能,并且提升用户体验. 一般来说Javascript ...

  2. Web Worker javascript多线程编程(二)

    Web Worker javascript多线程编程(一)中提到有两种Web Worker:专用线程dedicated web worker,以及共享线程shared web worker.不过主要讲 ...

  3. windows多线程编程实现 简单(1)

    内容:实现win32下的最基本多线程编程 使用函数: #CreateThread# 创建线程 HANDLE WINAPI CreateThread( LPSECURITY_ATTRIBUTES lpT ...

  4. Rust语言的多线程编程

    我写这篇短文的时候,正值Rust1.0发布不久,严格来说这是一门兼具C语言的执行效率和Java的开发效率的强大语言,它的所有权机制竟然让你无法写出线程不安全的代码,它是一门可以用来写操作系统的系统级语 ...

  5. windows多线程编程星球(一)

    以前在学校的时候,多线程这一部分是属于那种充满好奇但是又感觉很难掌握的部分.原因嘛我觉得是这玩意儿和编程语言无关,主要和操作系统的有关,所以这部分内容主要出现在讲原理的操作系统书的某一章,看完原理是懂 ...

  6. Java多线程编程核心技术---学习分享

    继承Thread类实现多线程 public class MyThread extends Thread { @Override public void run() { super.run(); Sys ...

  7. python多线程编程

    Python多线程编程中常用方法: 1.join()方法:如果一个线程或者在函数执行的过程中调用另一个线程,并且希望待其完成操作后才能执行,那么在调用线程的时就可以使用被调线程的join方法join( ...

  8. 浅述WinForm多线程编程与Control.Invoke的应用

    VS2008.C#3.0在WinForm开发中,我们通常不希望当窗体上点了某个按钮执行某个业务的时候,窗体就被卡死了,直到该业务执行完毕后才缓过来.一个最直接的方法便是使用多线程.多线程编程的方式在W ...

  9. Java—多线程编程

    一个多线程程序包含两个或多个能并发运行的部分.程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径. 进程:一个进程包括由操作系统分配的内存空间,包含一个或多个线程.一个线程不能独立的存 ...

随机推荐

  1. SRM710 div1 ReverseMancala(trick)

    题目大意, 给定一个有n个点的环,n不超过10,每个点上有一个权重 起始时权重将会给出,然后有2种操作 第一种操作是,选择一个位置i,获得权重w = a[i],把a[i]变成0,然后接下来在环上顺着走 ...

  2. RDMA

    什么是RDMA? 来源 https://blog.csdn.net/u011459120/article/details/78469098 1. 概述 RDMA是Remote Direct Memor ...

  3. [BZOJ4920][Lydsy六月月赛]薄饼切割

    [BZOJ4920][Lydsy六月月赛]薄饼切割 试题描述 有一天,tangjz 送给了 quailty 一张薄饼,tangjz 将它放在了水平桌面上,从上面看下去,薄饼形成了一个 \(H \tim ...

  4. [洛谷P2839][国家集训队]middle

    题目大意:给你一个长度为$n$的序列$s$.$Q$个询问,问在$s$中的左端点在$[a,b]$之间,右端点在$[c,d]$之间的子段中,最大的中位数. 强制在线. 题解:区间中位数?二分答案,如果询问 ...

  5. BZOJ3243 [Noi2013]向量内积 【乱搞】

    题目链接 BZOJ3243 题解 模数只有\(2\)或\(3\),可以大力讨论 如果模数为\(2\),乘积结果只有\(1\)或\(0\) 如果一个向量和前面所有向量乘积都为\(1\),那么其和前面向量 ...

  6. Sed basic and practice

    定义:Sed 是针对数据流的非交谈式编辑器,它在命令行下输入编辑命令并指定文件,然后可以在屏幕上看到编辑命令的输出结果. 好处:Sed 在缓冲区内默认逐行处理数据,所以源文件不会被更改和破坏. 格式: ...

  7. 转:通过Spring Session实现新一代的Session管理

    长期以来,session管理就是企业级Java中的一部分,以致于我们潜意识就认为它是已经解决的问题,在最近的记忆中,我们没有看到这个领域有很大的革新. 但是,现代的趋势是微服务以及可水平扩展的原生云应 ...

  8. Nginx使用教程----提高Nginx网络吞吐量之buffers优化

    请求缓冲区在NGINX请求处理中起着重要作用. 在接收到请求时,NGINX将其写入这些缓冲区. 这些缓冲区中的数据可作为NGINX变量使用,例如$request_body. 如果缓冲区与请求大小相比较 ...

  9. C语言编译各过程

    1.预处理 此阶段主要完成#符号后面的各项内容到源文件的替换,往往一些莫名其妙的错误都是出现在头文件中的,要在工程中注意积累一些错误知识. (1).#ifdef等内容,完成条件编译内容的替换 (2). ...

  10. Spring - IoC(2): 属性注入 & 构造注入

    依赖注入是指程序运行过程中,如果需要另外的对象协作(访问它的属性或调用它的方法)时,无须在代码中创建被调用者,而是依赖于外部容器的注入. 属性注入(Setter Injection) 属性注入是指 I ...