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 或 ...
随机推荐
- 智能指针 auto_ptr、scoped_ptr、shared_ptr、weak_ptr
什么是RAII? RAII是Resource Acquisition Is Initialization的简称,是C++语言的一种管理资源.避免泄漏的惯用法. RAII又叫做资源分配即初始化,即:定义 ...
- 黑苹果Yosemite 10.10.1 修改wowpc.iso文件免选择直接启动Mac系统
安装教程见: http://www.cnblogs.com/zouzf/p/4356641.html 网上很多教程都是OK的,但每个人的具体情况不同就可能有一些细节问题搞死你1.本文所指的 wowpc ...
- 2 Powershell与Cmd以及Unix/Linux Shell
上篇文章我说道,windows为了改变用户对其console界面的诟病,于是就从windows vista开始,计划要改变这种局面,于是就有 了Powershell的出现. 1.兼容shell命令 ...
- nginx上布置thinkphp
thinkphp config配置: ', //URL模式 nginx rewrite配置: location / { set $static 0; if ($uri ~ ...
- JNI_Z_07_方法的操作(没有String类型的参数)_参数的传递方式
1. 2.VC6(CPP)的DLL代码: #include<stdio.h> #include "jniZ_TjniMethod02.h" JNIEXPORT void ...
- javascript练习题(2):变量作用域
1. 外层变量在内部可以找到,反之找不到 以下看个案例: var a=10; function aaa(){ alert(a); } function bbb(){ var a=20; aaa(); ...
- 解决Python字符串处理出现错误UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe4 in position 108: ordinal not in range(128)
今天做课程设计遇到了和数据库交互的地方,sqlite数据库设置成utf-8格式编码,插入到数据库中是正确的,但是当读取出来的时候就会出错,原因就是Python的str默认是ascii编码,搜集网上的资 ...
- Xposed框架
Xposed框架,很好的一款软件,早起百团大战.外卖大战时候,对拉新用户有很大的帮助,一直没时间整理,今天有看到一个公众账号介绍这款,准备大概整理下,做个记录. 整理下思路 新用户,无非就是1.手机号 ...
- Flask安装配置
倒腾了一下午了,还是不太顺利,顺便记录一下. 硬件环境:win8.1 64位 + python2.7.9 32位 安装easy_install 需要先下载ez_setup.py(需要复制该链接中的内容 ...
- python面向对象( item系列,__enter__ 和__exit__,__call__方法,元类)
python面向对象进阶(下) item系列 __slots__方法 __next__ 和 __iter__实现迭代器 析构函数 上下文管理协议 元类一.item系列 把对象操作属性模拟成字典的 ...