看了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多进程多线程例子的更多相关文章

  1. Linux 多进程多线程相关概念

    进程:可执行程序是存储在磁盘设备上的由代码和数据按某种格式组织的静态实体,而进程是可被调度的代码的动态运行.在Linux系统中,每个进程都有各自的生命周期.在一个进程的生命周期中,都有各自的运行环境以 ...

  2. 进程 | 线程 | 当Linux多线程遭遇Linux多进程

    背景 本文并不是介绍Linux多进程多线程编程的科普文,如果希望系统学习Linux编程,可以看[<Unix环境高级编程>第3版] 本文是描述多进程多线程编程中遇到过的一个坑,并从内核角度分 ...

  3. Linux多进程之间的文件锁

    之前对于文件的操作通常在一个进程中完成,最近需要在两个进程中对同一个文件进行操作.故想到了文件锁. Linux下可以使用flock()函数对文件进行加锁解锁等操作.简单介绍下flock()函数: 表头 ...

  4. [转帖]Windows和Linux对决(多进程多线程)

    Windows和Linux对决(多进程多线程) https://blog.csdn.net/world_2015/article/details/44920467 太长了 还没看完.. 还是没太理解好 ...

  5. [转]一个简单的Linux多线程例子 带你洞悉互斥量 信号量 条件变量编程

    一个简单的Linux多线程例子 带你洞悉互斥量 信号量 条件变量编程 希望此文能给初学多线程编程的朋友带来帮助,也希望牛人多多指出错误. 另外感谢以下链接的作者给予,给我的学习带来了很大帮助 http ...

  6. 转载自~浮云比翼:Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)

    Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)   介绍:什么是线程,线程的优点是什么 线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可 ...

  7. Python 多进程 多线程 协程 I/O多路复用

    引言 在学习Python多进程.多线程之前,先脑补一下如下场景: 说有这么一道题:小红烧水需要10分钟,拖地需要5分钟,洗菜需要5分钟,如果一样一样去干,就是简单的加法,全部做完,需要20分钟:但是, ...

  8. Linux C 多线程

    原文:Linux C 多线程 linux下C语言多线程编程 #include <pthread.h> #include <stdio.h> #include <sys/t ...

  9. gdb常用命令及使用gdb调试多进程多线程程序

    一.常用普通调试命令 1.简单介绍GDB 介绍: gdb是Linux环境下的代码调试⼯具.使⽤:需要在源代码⽣成的时候加上 -g 选项.开始使⽤: gdb binFile退出: ctrl + d 或 ...

随机推荐

  1. UDP协议----简单的CS模型实现

    UDP简单介绍 传输层主要应用的协议模型有两种,一种是TCP协议,另外一种则是UDP协议.TCP协议在网络通信中占主导地位,绝大多数的网络通信借助TCP协议完成数据传输.但UDP也是网络通信中不可或缺 ...

  2. Linux下挂载windows的共享文件夹

    环境说明: 由于领导要求:现需要将某Linux服务器下的一个文件移动到某windows服务器下(服务器均在机房托管,要远程操作) 由于操作为一次性,则决定在windows下建立一个共享文件夹,linu ...

  3. Spring 模块

  4. 获取微信公众号用户的基本信息(UnionID机制)

    获取用户基本信息(UnionID机制) 在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的open ...

  5. application pool can not write to event log

    https://stackoverflow.com/questions/9564420/the-source-was-not-found-but-some-or-all-event-logs-coul ...

  6. Spring -- spring整合struts2

    1. 概述 spring和struts整合: 1.创建web程序 2.引入struts2类库. 3.创建HelloWorldAction package cn.itcast.struts2.actio ...

  7. Hibernate -- 对象关系映射基础

  8. scala学习手记19 - Option类型

    看到Option类型就知道这本教材应该要说那个了. 使用过guava后,应该知道guava中的Optional类的作用是什么.算了找下原始文档好了: Optional<T> is a wa ...

  9. selenium学习笔记(selenium IDE下载安装)

    今天自己一直在瞎捣鼓 最后这里整理下 selenium IDE 这个录制工具的下载安装 首先这个工具只支持火狐浏览器firefox.使用火狐浏览器进入selenium官网: http://www.se ...

  10. 牛客比赛-假的字符串-Trie+拓扑

    链接:https://www.nowcoder.com/acm/contest/59/B来源:牛客网 题目描述 给定n个字符串,互不相等,你可以任意指定字符之间的大小关系(即重定义字典序),求有多少个 ...