看了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. shell 中的 eval 及 crontab 命令

    eval eval会对后面的命令进行两遍扫描,如果第一遍扫描后,命令是个普通命令,则执行此命令:如果命令中含有变量的间接引用,则保证间接引用的语义.也就是说,eval命令将会首先扫描命令行进行所有的置 ...

  2. Book Review of “The practice of programming” (Ⅱ)

    The practice of programming Chapter 2 Algorithms and Data Structures Searching sequential search (li ...

  3. Centos6.5安装python2.7与pip

    安装Python2.7 安装环境 [root@localhost1 ~]# cat /etc/redhat-release CentOS release 6.5 (Final) [root@local ...

  4. 出入Spring boot(六)数据访问

    Spring Data提供了使用统一的API进行数据访问操作,这是Spring通过提供Spring DataCommons项目来实现的,它是Spring data的依赖Spring Data Comm ...

  5. Maven配置与创建

    1.下载Maven工具 从maven官网下载:https://maven.apache.org/download.cgi apache-maven-x.x.x-bin.zip ,解压到指定目录,例如D ...

  6. Java控制语句——分支、循环、跳转

    分支语句(if语句,switch语句): 循环语句(for,while,do...while); 跳转语句(break,continue,return): 分支语句(if语句,switch语句) if ...

  7. PAT1037. Magic Coupon (25)

    #include <iostream> #include <algorithm> #include <vector> using namespace std; in ...

  8. scala学习手记20 - 方法返回类型推断

    除了推演变量的类型,scala也会推演方法的返回类型.不过这里有一处需要注意:方法返回类型的推演依赖于方法的定义方式.如果用等号"="定义方法,scala就会推演方法返回类型:否则 ...

  9. ZC_RemoteThread

    1.Z_WinMain.cpp #include <windows.h> #include "resource.h" #include "Z_RemoteFu ...

  10. showdoc.js代码

    //页面加载完就执行 $(function(){ //自动根据url把当前菜单激活 var page_id = GetQueryString('page_id'); //如果中没有指定page_id, ...