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 或 ...
随机推荐
- JAVA基础补漏--继承
子类的对象在创建时,首先调用父类的构造函数,再调用子类自己的构造函数. 子类的构造函数中,有一个默认的super(),为一个无参调用,这个不显示,但会被首先调用,所有才会有父类构造函数被调用的情况. ...
- 主机不能访问虚拟机web服务的问题
虚拟机是CentOs 7 iptables -Fiptables -P INPUT ACCEPT 参考:http://blog.csdn.net/abnereel/article/details/41 ...
- Python中有趣的数据结构
链表 链表的基本操作 >>> a = [66.25,333,333,1,1234.5] >>> print a.count(333),a.count(66.25), ...
- 使用springmvc时报错JSPs only permit GET POST or HEAD
两个地方需要注意:第一处在web.xml文件中不要忘记配置 <filter> <filter-name>HiddenHttpMethodFilter</filter-na ...
- d2.js学习笔记(七)——动态SVG坐标空间
目标 在这一章,我们将学习如何使SVG坐标空间是动态的,这样我们的数据可视化不论数据是什么,都始终是可见的. 我们会使得SVG坐标空间尺度上调或下调来适于我们的数据. 三个SVG长方形 我们就从三个长 ...
- python线程、进程和协程
链接:http://www.jb51.net/article/88825.htm 引言 解释器环境:python3.5.1 我们都知道python网络编程的两大必学模块socket和socketser ...
- eclipse导入android项目错误,项目名称上有红叉,但代码中无报错
首先,在项目上右键,属性,选择编译目标,选择android版本或把Android的版本调高一点.
- 牛客比赛-假的字符串-Trie+拓扑
链接:https://www.nowcoder.com/acm/contest/59/B来源:牛客网 题目描述 给定n个字符串,互不相等,你可以任意指定字符之间的大小关系(即重定义字典序),求有多少个 ...
- js获取一周的日期范围
function getWeek() { this.nowTime = new Date(); this.init = function() { this.dayInWeek = this.nowTi ...
- 条款20:在传递对象的时候尽量用reference-to-constent来代替,pass-by-value
注意一下,c++的底层编译器而言,引用类型往往都是由指针来实现出来的,所以pass-by-reference实际意义上往往是传递了一个指针,这对于c++的内置类型来说往往传递一个reference更加 ...