Linux多进程多线程例子
看了apue3,关于进程线程和进程间通信写了一个例子,方便自己理解相关知识,备忘。
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h> //这里全局变量简化线程代码量而已,实际应该在线程获取这些变量再操作。
long *shmaddr;
int semid; /**
* 互斥量加或减
* @param semid 互斥量id
* @param pv 整数加,负数减
*/
void sem_pv(int semid, short pv)
{
struct sembuf buf = {, , };
buf.sem_op = pv;
buf.sem_num = ;
semop(semid, &buf, );
} void *do_thread(void *arg)
{
long index = (long)arg;
srand(index + time()); //(时间 + 索引号)生成随机种子
while () {
sleep(rand() % + ); //睡眠1~8s
sem_pv(semid, -); //sem - 1,若sem = 1,不阻塞,若sem = 0,阻塞
*shmaddr += index; //共享值 += 线程号
printf("This is %ld thread, *shmaddr = %ld!!\n", index, *shmaddr);
sem_pv(semid, +); //sem + 1,唤醒其他已经阻塞的线程
}
pthread_exit((arg));
} #define PROJ_ID 8 int main(int argc, char const *argv[])
{
pid_t pid[];
pthread_t thid[];
key_t key;
int shmid;
int i;
long index; //这里使用long是(void *)<---->long,long和指针占用内存大小(主机64bit)一样,否则gcc会报warnning
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
} semopts; if ((key = ftok("." , PROJ_ID )) == -) {
perror("ftok error");
exit();
}
if ((shmid = shmget(key, sizeof(long), IPC_CREAT | )) == -) {
perror("shmget error");
exit();
}
if ((shmaddr = (long *)shmat(shmid, NULL, )) == (long *) - ) {
perror("shmat error");
exit();
}
*shmaddr = ; //初始化共享量 if ((semid = semget(key, , IPC_CREAT | )) == -) {
perror("semget failed");
exit();
}
semopts.val = ; //信号量初始为1 if (semctl(semid, , SETVAL, semopts) == -) {
perror("semctl failed");
exit();
}
//创建4进程 & 8线程
for (i = ; i < ; ++i) {
pid[i] = fork();
if (pid[i] == ) {
index = * i + ;
if (pthread_create(&thid[index], NULL, do_thread, (void *)index) != ) {
perror("thread error");
exit();
}
index++;
if (pthread_create(&thid[index], NULL, do_thread, (void *)index) != ) {
perror("thread error");
exit();
}
sleep();
printf("This is %d process\n", i);
printf("Children's pid = %d, ppid = %d\n", getpid(), getppid());
while ()
sleep();
exit(); } else if (pid[i] < ) {
perror("fork error");
exit();
}
}
//父进程退出,4个子进程成为孤儿进程
exit();
}
程序开启4进程8线程同时一起累加。线程可以用全局变量同步,但4个子进程间不能共享累加结果,需要用进程共享量。同时涉及到多线程多进程的并发,需要用进程互斥量。
Linux多进程多线程例子的更多相关文章
- Linux 多进程多线程相关概念
进程:可执行程序是存储在磁盘设备上的由代码和数据按某种格式组织的静态实体,而进程是可被调度的代码的动态运行.在Linux系统中,每个进程都有各自的生命周期.在一个进程的生命周期中,都有各自的运行环境以 ...
- 进程 | 线程 | 当Linux多线程遭遇Linux多进程
背景 本文并不是介绍Linux多进程多线程编程的科普文,如果希望系统学习Linux编程,可以看[<Unix环境高级编程>第3版] 本文是描述多进程多线程编程中遇到过的一个坑,并从内核角度分 ...
- Linux多进程之间的文件锁
之前对于文件的操作通常在一个进程中完成,最近需要在两个进程中对同一个文件进行操作.故想到了文件锁. Linux下可以使用flock()函数对文件进行加锁解锁等操作.简单介绍下flock()函数: 表头 ...
- [转帖]Windows和Linux对决(多进程多线程)
Windows和Linux对决(多进程多线程) https://blog.csdn.net/world_2015/article/details/44920467 太长了 还没看完.. 还是没太理解好 ...
- [转]一个简单的Linux多线程例子 带你洞悉互斥量 信号量 条件变量编程
一个简单的Linux多线程例子 带你洞悉互斥量 信号量 条件变量编程 希望此文能给初学多线程编程的朋友带来帮助,也希望牛人多多指出错误. 另外感谢以下链接的作者给予,给我的学习带来了很大帮助 http ...
- 转载自~浮云比翼:Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)
Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥) 介绍:什么是线程,线程的优点是什么 线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可 ...
- Python 多进程 多线程 协程 I/O多路复用
引言 在学习Python多进程.多线程之前,先脑补一下如下场景: 说有这么一道题:小红烧水需要10分钟,拖地需要5分钟,洗菜需要5分钟,如果一样一样去干,就是简单的加法,全部做完,需要20分钟:但是, ...
- Linux C 多线程
原文:Linux C 多线程 linux下C语言多线程编程 #include <pthread.h> #include <stdio.h> #include <sys/t ...
- gdb常用命令及使用gdb调试多进程多线程程序
一.常用普通调试命令 1.简单介绍GDB 介绍: gdb是Linux环境下的代码调试⼯具.使⽤:需要在源代码⽣成的时候加上 -g 选项.开始使⽤: gdb binFile退出: ctrl + d 或 ...
随机推荐
- 纯CSS3滑动开关按钮
在线演示 本地下载
- 《Maven实战》第6章 仓库
6.1什么是Maven仓库? Maven仓库:存储所有Maven项目共享的构件的统一位置. Maven仓库的作用:Maven项目仅需声明依赖坐标,即可在需要的时候自动根据坐标找到仓库中的构件. 6.2 ...
- HDU 1176 免费馅饼 简单动态规划
世道很简单的动态规划,但是却错了,让我很无语,改来改去还是不对,第二天有写就对了,之后我就耐着性子慢慢比较之前的错误代码,发现 第一次错:纯粹用了a[i][j]+=max3(a[i+1][j-1], ...
- jquery中ajax回调函数使用this
今天在写ajax请求的的时候success中代码老是不能正常执行,找了半天的原因,代码如下: 1 $.ajax({type: 'GET', 2 url: url, 3 data: oData, 4 s ...
- Mac安装搭建sublimeText3开发Nodejs环境
原文] [基本环境 安装Nodejs 这个直接就可以去官网下载就可以了.Nodejs官网 根据自己的PC系统类型选择对应的版本下载之后就可以了. 安装SublimeText3 这个也是直接去Subli ...
- MFC中如何在一个类中调用另一个类的控件
学习记录: 两个类,一个为主类 1个为:CCkDlg,主类 1个为: Https,用来做HTTPS请求获得页面状态. 测试界面如下: CCkDlg 类里定义函数 void CCkDlg::printf ...
- PermutationSequence,求第k个全排列
问题描述:给定一个数组,数组里面元素不重复,求第k个全排列. 算法分析:这道题就是用到取商取模运算. public String getPermutation(int n, int k) { // i ...
- Spark 宽窄依赖
面试时被问到spark RDD的宽窄依赖,虽然问题很简单,但是答得很不好.还是应该整理一下描述,这样面试才能答得更好. 看到一篇很好的文章,转载过来了.感觉比<spark技术内幕>这本书讲 ...
- shell 数组操作
1. 定义数组: var_array=(one two three four five) 2.常用操作 获取数组长度: ${#var_array[@]} 获取所有数组元素: ${var_array[ ...
- WPF的外观装饰类——Border
public class Border : System.Windows.Controls.Decorator 说明:在另一个元素的周围绘制边框.背景或同时绘制二者.