Thread(简单使用)
/***
thread.c
***/
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h> void print_message_function(void* ptr); int main()
{
int tmp1,tmp2;
void* retval;
pthread_t thread1,thread2;
char* message1 = "thread1";
char* message2 = "thread2"; int ret_thrd1,ret_thrd2;
ret_thrd1 = pthread_create(&thread1,NULL,(void*)&print_message_function,(void*)message1);
ret_thrd2 = pthread_create(&thread2,NULL,(void*)&print_message_function,(void*)message2); if(ret_thrd1 != )
{
printf("create thread 1 failed\n");
}
else
{
printf("create thread 1 success\n");
} if(ret_thrd2 != )
{
printf("create thread 2 failed\n");
}
else
{
printf("create thread 2 success\n");
} tmp1 = pthread_join(thread1,&retval);
printf("thread1 return value(retval) is %d\n",(int)retval);
printf("thread1 return value(tmp) is %d\n",tmp1);
if(tmp1 != )
{
printf("cannot join with thread1\n");
}
printf("thread1 end\n"); tmp2 = pthread_join(thread2,&retval);
printf("thread2 return value(retval) is %d\n",(int)retval);
printf("thread2 return value(tmp) is %d\n",tmp2);
if(tmp2 != )
{
printf("cannot join with thread2\n");
}
printf("thread2 end\n");
return ;
} void print_message_function(void* ptr)
{
int i;
for(i = ; i < ; i++)
{
printf("%s:%d\n",(char*)ptr,i);
}
}
运行结果:
exbot@ubuntu:~/wangqinghe/thread/thread_0530$ ./thread
create thread 1 success
create thread 2 success
thread2:0
thread2:1
thread2:2
thread2:3
thread2:4
thread1:0
thread1:1
thread1:2
thread1:3
thread1:4
thread1 return value(retval) is 10
thread1 return value(tmp) is 0
thread1 end
thread2 return value(retval) is 10
thread2 return value(tmp) is 0
thread2 end
/***
simple example
***/
#include<stdio.h>
#include<pthread.h> void thread(void)
{
int i;
for(i = ; i < ; i++)
{
printf("This is a pthread.\n");
}
} int main()
{
pthread_t id;
int i,ret;
ret = pthread_create(&id,NULL,(void*)thread,NULL);
if(ret != )
{
printf("Create pthread error!\n");
exit();
}
for(i = ; i < ; i++)
{
printf("This is the main process.\n");
}
pthread_join(id,NULL);
return ;
}
运行结果:
exbot@ubuntu:~/wangqinghe/thread/thread_0530$ ./thread1
This is the main process.
This is the main process.
This is the main process.
This is a pthread.
This is a pthread.
This is a pthread.
/***
pthread.c
***/
//gcc pthread.c -o pthread -lpthread
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<pthread.h> void * print_a(void*);
void * print_b(void*); int main()
{
pthread_t t0;
pthread_t t1; if(pthread_create(&t0,NULL,print_a,NULL) == -)
{
puts("fail to create pthread t0");
exit();
}
if(pthread_create(&t1,NULL,print_b,NULL) == -)
{
puts("fail to create pthread t1");
exit();
}
void* result;
if(pthread_join(t0,&result) == -)
{
puts("fail to recollect t0");
exit();
}
if(pthread_join(t1,&result) == -)
{
puts("fail to create recollect t1");
exit();
}
return ;
} void * print_a(void*)
{
for(int i = ; i < ; i++)
{
sleep();
puts("aa");
}
return NULL;
}
void * print_b(void*)
{
for(int i = ; i < ; i++)
{
sleep();
puts("bb");
}
return NULL;
}
运行结果:
exbot@ubuntu:~/wangqinghe/thread$ ./pthread
bb
aa
bb
aa
bb
aa
bb
aa
aa
bb
bb
aa
bb
aa
aa
bb
bb
aa
aa
bb
bb
bb
bb
bb
bb
^C
/***
no_mutex.c
***/
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h> int sharedi = ;
void increase_num(void); int main()
{
int ret;
pthread_t thrd1,thrd2,thrd3;
ret = pthread_create(&thrd1,NULL,(void *)increase_num,NULL);
ret = pthread_create(&thrd2,NULL,(void*)increase_num,NULL);
ret = pthread_create(&thrd3,NULL,(void*)increase_num,NULL);
pthread_join(thrd1,NULL);
pthread_join(thrd2,NULL);
pthread_join(thrd3,NULL); printf("sharedi = %d\n",sharedi); return ;
} void increase_num(void)
{
long i,tmp;
for(i = ; i < ; i++)
{
tmp = sharedi;
tmp = tmp + ;
sharedi = tmp;
}
}
运行结果:
exbot@ubuntu:~/wangqinghe/thread/thread_0611$ ./no_mutex
sharedi = 3000
Thread(简单使用)的更多相关文章
- 【转】【C#】【Thread】【Task】多线程
多线程 多线程在4.0中被简化了很多,仅仅只需要用到System.Threading.Tasks.::.Task类,下面就来详细介绍下Task类的使用. 一.简单使用 开启一个线程,执行循环方法,返回 ...
- C++使用thread类多线程编程
转自:C++使用thread类多线程编程 C++11中引入了一个用于多线程操作的thread类,下面进行简单演示如何使用,以及如果进行多线程同步. thread简单示例 #include <io ...
- java多线程(简单介绍)
简单介绍 线程是程序运行的基本执行单元.当操作系统(不包括单线程的操作系统,如微软早期的DOS)在执行一个程序时,会在系统中建立一个进程,而在这个进程中,必须至少建立一个线程(这个线程被称为主线程)来 ...
- Pintos-斯坦福大学操作系统Project详解-Project1
转载请注明出处. 前言: 本实验来自斯坦福大学cs140课程,只限于教学用途,以下是他们对于Pintos系统的介绍: Pintos is a simple operating system fra ...
- python运维开发(十)----IO多路复用线程基本使用
内容目录: python作用域 python2.7和python3.5的多继承区别 IO多路复用 socketserver模块源分析 多线程.进程.协程 python作用域 python中无块级作用 ...
- c#多线程随记回顾
C#多线程随记回顾 1.创建多线程方式知道的有三种: ---手动创建Thread.使用线程池.使用task任务 ---手动创建Thread,分两种带参数和不带参数的帮助委托器 eg: //帮助器委托 ...
- Java线程和线程池
Android中创建线程的方式有,new Thread,new Thread(Runnable),new Thread(Callable)的形式. A. 直接new Thread简单方便. B. ne ...
- AbstractQueuedSynchronizer源码分析
AbstractQueuedSynchronizer源码分析 前提 AQS(java.util.concurrent.locks.AbstractQueuedSynchronizer)是并发编程大师D ...
- 06 ASP.net
ASP.net 第一天 理解浏览器与服务器概念,与WinForm的区别. C# IIS(Internet Information Service) 互联网信息服务 Java(Tomcat) Php(A ...
- C#多线程与异步
1.什么是异步同步 如果一个方法被调用,调用者需要等待该方法被执行完毕之后才能继续执行,则是同步. 如果方法被调用后立刻返回,即使该方法是一个耗时操作,也能立刻返回到调用者,调用者不需要等待该方法,则 ...
随机推荐
- Unknown custom element: <swiper>
刚开始使用VUE,一直提示这个,后来才发现是注册组件时注册反了:先新建VUE实例再注册组件是问题根源,调转一下顺序即可解决
- axios配置
import axios, { isCancel } from 'axios' import { md5 } from 'vux' import util from '@/libs/util' imp ...
- 清除vs2005、vs2008起始页最近打开项目
有时候vs2005起始最近打开项目过多很想清除掉,但打遍了也没找到清除选项在哪里,今天找到了方法,发上来和大家共享. 方法一手工操作方法:1)删除最近打开的文件运行regedit,打开HKEY_CUR ...
- SQL的GROUP BY 与 Order By
1.概述 “Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理. 2.原始表 3.简 ...
- NSIS MUI 的内置向导页面
MUI 的内置向导页面和安装程序有关的向导页面MUI_PAGE_WELCOME 该向导页面显示欢迎信息MUI_PAGE_LICENSE text/rtf_file 该向导页面显示软件授权申明MUI_P ...
- Laravel 实现多级控制器(实现Api区分版本)
路由: Route::get('', 'v1\\UserController@index'); 文件夹分层 User控制器命名空间: namespace App\Http\Controllers\v1 ...
- Oracle 触发器学习笔记一
触发器名:触发器对象的名称.由于触发器是数据库自动执行的,因此该名称只是一个名称,没有实质的用途.触发时间:指明触发器何时执行,该值可取:before:表示在数据库动作之前触发器执行;after:表示 ...
- [易学易懂系列|rustlang语言|零基础|快速入门|(22)|宏Macro]
[易学易懂系列|rustlang语言|零基础|快速入门|(22)|宏Macro] 实用知识 宏Macro 我们今天来讲讲Rust中强大的宏Macro. Rust的宏macro是实现元编程的强大工具. ...
- vmware的32位和64位的问题
想安装一个vmware的64位版本,在网上下载了64位版本之后,安装目录仍然在C:\Program Files (x86)目录下,上网查询之后得知,vmware12的主程序是32位的,但是主要的系统服 ...
- Java-20180412
今天开始重新复习Java,完成了leetcode的第一题. 1.算法: 给定一个数组和目标值,找出相加等于目标值的数组元素的下标. 数组[2,7,11,15]; target:9; 返回:[0,1]; ...