linux下的C\C++多进程多线程编程实例详解

linux下的C\C++多进程多线程编程实例详解

1、多进程编程

#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h> 

int main()
{
  pid_t child_pid; 

  /* 创建一个子进程 */
  child_pid = fork();
  if(child_pid == 0)
  {
    printf("child pid\n");
    exit(0);
  }
  else
  {
    printf("father pid\n");
    sleep(60);
  } 

  return 0;
}

 2、多线程编程

#include <stdio.h>
#include <pthread.h> 

struct char_print_params
{
  char character;
  int count;
}; 

void *char_print(void *parameters)
{
  struct char_print_params *p = (struct char_print_params *)parameters;
  int i; 

  for(i = 0; i < p->count; i++)
  {
    fputc(p->character,stderr);
  } 

  return NULL;
} 

int main()
{
  pthread_t thread1_id;
  pthread_t thread2_id;
  struct char_print_params thread1_args;
  struct char_print_params thread2_args; 

  thread1_args.character = 'x';
  thread1_args.count = 3000;
  pthread_create(&thread1_id, NULL, &char_print, &thread1_args); 

  thread2_args.character = 'o';
  thread2_args.count = 2000;
  pthread_create(&thread2_id, NULL, &char_print, &thread2_args); 

  pthread_join(thread1_id, NULL);
  pthread_join(thread2_id, NULL); 

  return 0;
}

3、线程同步与互斥

1)、互斥

pthread_mutex_t mutex;
pthread_mutex_init(&mutex, NULL); 

/*也可以用下面的方式初始化*/
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 

pthread_mutex_lock(&mutex);
/* 互斥  */ 

thread_flag = value; 

pthread_mutex_unlock(&mutex);

2)、条件变量

int thread_flag = 0;
pthread_mutex_t mutex;
pthread_cond_t thread_flag_cv;\ 

void init_flag()
{
  pthread_mutex_init(&mutex, NULL);
  pthread_cond_init(&thread_flag_cv, NULL);
  thread_flag = 0;
} 

void *thread_function(void *thread_flag)
{
  while(1)
  {
    pthread_mutex_lock(&mutex);
    while(thread_flag != 0 )
    {
      pthread_cond_wait(&thread_flag_cv, &mutex);
    }
    pthread_mutex_unlock(&mutex); 

    do_work();
  } 

  return NULL;
} 

void set_thread_flag(int flag_value)
{
  pthread_mutex_lock(&mutex);
  thread_flag = flag_value; 

  pthread_cond_signal(&thread_flag_cv);
  pthread_mutex_unlock(&mutex);
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • linux多线程编程(四)

    linux线程分为两类:一是核心级支持线程,二是用户级的线程.一般都为用户级的线程. 一.多线程的几个常见函数 要创建多线程必须加载pthread.h文件,库文件pthread.线程的标识符pthread_t在头文件/usr/include/bits/pthreadtypes.h中定义:typedef  unsigned  long  int  pthread_t 1.创建线程: int pthread_create(pthread_t *restrict thread,           

  • linux多线程编程详解教程(线程通过信号量实现通信代码)

    线程分类 线程按照其调度者可以分为用户级线程和核心级线程两种. (1)用户级线程 用户级线程主要解决的是上下文切换的问题,它的调度算法和调度过程全部由用户自行选择决定,在运行时不需要特定的内核支持.在这里,操作系统往往会提供一个用户空间的线程库,该线程库提供了线程的创建.调度.撤销等功能,而内核仍然仅对进程进行管理.如果一个进程中的某一个线程调用了一个阻塞的系统调用,那么该进程包括该进程中的其他所有线程也同时被阻塞.这种用户级线程的主要缺点是在一个进程中的多个线程的调度中无法发挥多处理器的优势.

  • 详解Linux多线程使用信号量同步

    信号量.同步这些名词在进程间通信时就已经说过,在这里它们的意思是相同的,只不过是同步的对象不同而已.但是下面介绍的信号量的接口是用于线程的信号量,注意不要跟用于进程间通信的信号量混淆. 一.什么是信号量 线程的信号量与进程间通信中使用的信号量的概念是一样,它是一种特殊的变量,它可以被增加或减少,但对其的关键访问被保证是原子操作.如果一个程序中有多个线程试图改变一个信号量的值,系统将保证所有的操作都将依次进行. 而只有0和1两种取值的信号量叫做二进制信号量,在这里将重点介绍.而信号量一般常用于保护

  • Linux多线程环境下 关于进程线程终止函数总结

    pthread_kill: pthread_kill与kill有区别,是向线程发送signal.,大部分signal的默认动作是终止进程的运行,所以,我们才要用signal()去抓信号并加上处理函数. int pthread_kill(pthread_t thread, int sig); 向指定ID的线程发送sig信号,如果线程代码内不做处理,则按照信号默认的行为影响整个进程,也就是说,如果你给一个线程发送了SIGQUIT,但线程却没有实现signal处理函数,则整个进程退出. pthread

  • Linux多线程编程(一)

    一.什么是线程? 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 二.什么时候使用多线程?     当多个任务可以并行执行时,可以为每个任务启动一个线程. 三.线程的创建     使用pthread_create函数. #include<pthread.h> int pthread_create

  • Linux下的多线程编程(三)

    下面先来一个实例.我们通过创建两个线程来实现对一个数的递加. 或许这个实例没有实际运用的价值,但是稍微改动一下,我们就可以用到其他地方去拉. 下面是我们的代码: /*thread_example.c : c multiple thread programming in linux *author : falcon *E-mail : tunzhj03@st.lzu.edu.cn */ #include <pthread.h> #include <stdio.h> #include

  • Linux中多线程详解及简单实例

    Linux中多线程详解及简单实例 1.概念 进程:运行中的程序. 线程:一个程序中的多个执行路径.更准确的定义是:线程是一个进程内部的一个控制序列. 2.为什么要有线程? 用fork调用进程代价太高,需要让一个进程同时做多件事情,线程就非常有用. 3.线程的优点和缺点. 优点: (1)有时,让程序看起来是在同时做两件事是非常有用的. 比如在编辑文档时,还能统计文档里的单词个数. (2)一个混杂着输入.计算.输出的程序,利用线程可以将这3个部 分分成3个线程来执行,从而改变程序执行的性能. (3)

  • Linux多线程锁属性设置方法

    互斥锁是Linux下多线程资源保护的常用手段,但是在时序复杂的情况下,很容易会出现死锁的情况. 可以通过设置锁的属性,避免同一条线程重复上锁导致死锁的问题. 通过int pthread_mutexattr_settype(pthread_mutexattr_t *attr, int type)接口设置 一般是以下四种属性: PTHREAD_MUTEX_NORMAL This type of mutex does not detect deadlock. A thread attempting t

  • 浅析Linux下一个简单的多线程互斥锁的例子

    复制代码 代码如下: #include <stdio.h>#include <pthread.h>pthread_mutex_t Device_mutex ;int count=0;void thread_func1(){   while(1)   {       pthread_mutex_lock(&Device_mutex);       printf("thread1: %d\n",count);       pthread_mutex_unlo

  • linux下的C\C++多进程多线程编程实例详解

    linux下的C\C++多进程多线程编程实例详解 1.多进程编程 #include <stdlib.h> #include <sys/types.h> #include <unistd.h> int main() { pid_t child_pid; /* 创建一个子进程 */ child_pid = fork(); if(child_pid == 0) { printf("child pid\n"); exit(0); } else { print

  • Linux下重启oracle服务及监听器和实例详解

    一.在Linux下重启Oracle数据库及监听器: 方法1: 用root以ssh登录到linux,打开终端输入以下命令: cd $ORACLE_HOME #进入到oracle的安装目录 dbstart #重启服务器 lsnrctl start #重启监听器 cd $ORACLE_HOME #进入到oracle的安装目录 dbstart #重启服务器 lsnrctl start #重启监听器 ----------------------------------- 方法2: Sql代码 cd $OR

  • JAVA多线程编程实例详解

    本文实例讲述了JAVA多线程编程.分享给大家供大家参考,具体如下: 进程是系统进行资源调度和分配的一个独立单位. 进程的特点 独立性:进程是系统中独立存在的实体,拥有自己的独立资源和私有空间.在没有经过进程本身允许的情况下,不能直接访问其他进程. 动态性:进程与程序的区别在于,前者是一个正在系统中活动的指令,而后者仅仅是一个静态的指令集合 并发性:多个进程可以在单个处理器上并发执行,而不受影响. 并发性和并行性的区别: 并行性:在同一时刻,有多条指令在多个处理器上同时执行(多个CPU) 并发性:

  • Linux下几种并发服务器的实现模式(详解)

    1>单线程或者单进程 相当于短链接,当accept之后,就开始数据的接收和数据的发送,不接受新的连接,即一个server,一个client 不存在并发. 2>循环服务器和并发服务器 1.循环服务器:一个server只能一次只能接收一个client,当当前client结束访问之后才能进行下一个client的连接. 2.并发服务器:一个server同一时间可以响应很多客户端的访问. 3>select+多线程模式 并发服务器的三种实现方式 1.多进程并发服务器 是指TCP连接后,每一个客户机的

  • java多线程编程技术详解和实例代码

     java多线程编程技术详解和实例代码 1.   Java和他的API都可以使用并发. 可以指定程序包含不同的执行线程,每个线程都具有自己的方法调用堆栈和程序计数器,使得线程在与其他线程并发地执行能够共享程序范围内的资源,比如共享内存,这种能力被称为多线程编程(multithreading),在核心的C和C++语言中并不具备这种能力,尽管他们影响了JAVA的设计. 2.   线程的生命周期 新线程的生命周期从"新生"状态开始.程序启动线程前,线程一直是"新生"状态:

  • linux下umask命令用途原理和计算方式详解

    目录 umask umask用途 原理 1. umask值 2. 文件目录权限最大值 3. 常规计算 4. 严谨计算 umask值修改 1. 临时生效(当前会话) 2. 永久生效 总结 umask umask用途 umask令新建文件和目录拥有默认权限. 可以看到root创建的目录是755,文件是644 [root@zaishu zaishu]# touch test.txt [root@zaishu zaishu]# mkdir test [root@zaishu zaishu]# ls -l

  • Java多线程ForkJoinPool实例详解

    引言 java 7提供了另外一个很有用的线程池框架,Fork/Join框架 理论 Fork/Join框架主要有以下两个类组成. * ForkJoinPool 这个类实现了ExecutorService接口和工作窃取算法(Work-Stealing Algorithm).它管理工作者线程,并提供任务的状态信息,以及任务的执行信息 * ForkJoinTask 这个类是一个将在ForkJoinPool执行的任务的基类. Fork/Join框架提供了在一个任务里执行fork()和join()操作的机制

  • Java 多线程优先级实例详解

    Java 多线程优先级实例详解 线程的优先级将该线程的重要性传递给调度器.尽管CPU处理现有线程集的顺序是不确定的,但是调度器将倾向于让优先权最高的线程先执行. 你可以用getPriority()来读取现有线程的优先级,并且在任何时刻都可以通过setPriority()来修改优先级. import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class SimplePrio

  • Python 多线程的实例详解

     Python 多线程的实例详解 一)线程基础 1.创建线程: thread模块提供了start_new_thread函数,用以创建线程.start_new_thread函数成功创建后还可以对其进行操作. 其函数原型: start_new_thread(function,atgs[,kwargs]) 其参数含义如下: function: 在线程中执行的函数名     args:元组形式的参数列表.     kwargs: 可选参数,以字典的形式指定参数 方法一:通过使用thread模块中的函数创

  • C++中Socket网络编程实例详解

    C++中Socket网络编程实例详解 现在几乎所有C/C++的后台程序都需要进行网络通讯,其实现方法无非有两种:使用系统底层socket或者使用已有的封装好的网络库.本文对两种方式进行总结,并介绍一个轻量级的网络通讯库ZeroMQ.  1.基本的Scoket编程 关于基本的scoket编程网络上已有很多资料,作者在这里引用一篇文章中的内容进行简要说明. 基于socket编程,基本上就是以下6个步骤: 1.socket()函数 2.bind()函数 3.listen().connect()函数 4

随机推荐