linux下的多线程
来源:互联网 发布:南京烘焙培训班 知乎 编辑:程序博客网 时间:2024/05/10 03:10
linux 多线程程序设计(thread)
进程(分配独立的地址空间,代码段(shm)、数据段(cpy)、堆栈段(cpy))----线程(都共享、一个线程的数据可以直接为其他线程所用、快捷)【多任务,并发的工作方式】
linux系统下的多线程遵循 POSIX线程接口,称为:pthread
创建线程(执行所指定的函数,执行完了线程就结束了)
int pthread_create(pathread_t *tidp/*线程id*/,const pthread_attr_t *attr/*线程属性置为NULL*/,void *(*start_rtn)(void)/*线程要执行的函数*/,void *arg/*start_rnt参数*/)
pthread 的库不是linux系统的库,所以编译时用:gcc filename -lpthread -o xxxx
//thread_creat.c
#include<stdio.h>
#include<pthread.h>
void *mythread1(void)
{
int i;
for(i=0;i<100;i++)
{
printf("this is the 1st pathread creat by zieckey!\n");
sleep(1);
}
}
void *mythread2(void)
{
int i;
for(i=0;i<100;i++)
{
printf("this is the 2st pathread creat by zieckey!\n");
sleep(1);
}
}
int main()
{
int i=0,ret=0;
pthread_t id1,id2;
ret=pthread_create(&id1,NULL,(void *)mythread1,NULL);
if(ret)
{
printf("create pthread1 error!\n");
return -1;
}
ret=pthread_crreat(&id2,NULL,(void *)mythread2,NULL);
if(ret)
{
printf("creat pthread2 error!\n");
return -1;
}
pthread_join(id1,NULL);
pthread_join(id2,NULL);
return 0;
}
//thread_init.c
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
void *creat(void *arg)
{
int *num;
num=(int *)arg;
printf("creat parameter is %d \n",*num);
return (void *)0;
}
int main(int argc,char *argv[])
{
pthread_t tidp;
int error;
int test=4;
int *attr=&test;
error=pthread_creat(&tidp,NULL,creat,(void *)attr);
if(error)
{
printf("pthread_creat is created is not created...\n");
return -1;
}
sleep(1);
printf("pthread_creat is created ...\n");
}
//thread_share.c(线程共享数据段)
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
int a=1;//在数据段里
void *create(void *arg)
{
printf("new pthread ...\n");
printf("a=%d\n",a);
a++;
return (void *)0;
}
int main(int argc,char *argv[])
{
pthread_t tidp;
int error;
int a=5;//在栈里
printf("in main 1 a=%d\n",a);
error=pthread_creat(&tidp,NULL,creat,NULL);
if(error!=0)
{
printf("new thread is not creat ...\n");
return -1;
}
sleep(3);
printf("in main 2 a=%d\n",a);
printf("new thread is creat...\n");
return 0;
}
终止线程:pthread_exit
exit、_exit;终止进程的函数
#include<pthread.h>
void pthread_exit(void *rval_ptr)
rval_ptr:线程退出返回值的指针
线程等待:
#include<pthread.h>
int pthread_join(pthread_t tid,void **rval_ptr)
线程标识:获取调用线程的thread identifiler
#include<pthread.h>
pthread_t pthread_self(void)
#include<stdio.h>
#include<pthread.h>
void *mythread(void *arg)
{
printf("new thread...\n");
printf("this thread's id is %u\n",(unsigned int)pthread_self());//获取线程ID
printf("the process pid is %d \n",getpid());//获得进程ID
return (void *)0;
}
int main(int argc,char*argv[])
{
int ret;
pthread_t id;
ret=pthread_create(&id,NULL,(void *)mythread,NULL);
if(ret)
{
printf("create pthread error!\n");
return -1;
}
printf("the main process's pid is %d \n",getpid());
sleep(1);
return 0;
}
清除
终止方式:正常终止和非正常终止
#include<pthread.h>【进栈出栈】
pthread_cleanup_push(void(*rtn)(void *),void *arg)
rtn:清除函数
arg:清除函数的参数
pthread_cleanup_pop(int execute)
execute:为0时,函数不执行
#include<stdio.h>
#include<pthread.h>
void *clean(void *arg)
{
printf("cleanup :%s",(char *)arg);
}
void *mythread1(void)
{
printf("thread 1 start \n");
pthread_cleanup_push((void*)clean,"thread 1 first hander");
pthread_cleanup_push((void*)clean,"thread 1 second hander");
printf(""thread 1 push complete \n);
if(arg)
{
return((void *)1);
}
pthread_cleanup_pop(0);
pthread_cleanup_pop(0);
return ((void *)1);
}
void *mythread2(void)
{
printf("thread 2 start \n");
pthread_cleanup_push((void*)clean,"thread 2 first hander");
pthread_cleanup_push((void*)clean,"thread 2 second hander");
printf(""thread 2 push complete \n);
if(arg)
{
return((void *)2);
}
pthread_cleanup_pop(0);
pthread_cleanup_pop(0);
return ((void *)2);
}
int main(void)
{
int ret;
pthread_t id1,id2;
ret=pthread_create(&id1,NULL,(void *)mythread1,NULL);
if(ret)
{
printf("create pthread1 error!\n");
return -1;
}
ret=pthread_crreat(&id2,NULL,(void *)mythread2,NULL);
if(ret)
{
printf("creat pthread2 error!\n");
return -1;
}
pthread_join(id1,NULL);
pthread_join(id2,NULL);
return 0;
- linux下的多线程
- linux下的多线程
- linux下的多线程
- linux下的多线程
- linux下的多线程
- Linux下的多线程编程
- Linux下的多线程编程
- Linux下的多线程编程
- Linux下的多线程编程
- Linux下的多线程编程
- Linux下的多线程编程
- linux 下的多线程编程
- Linux下的多线程编程
- linux下的多线程编程
- Linux下的多线程编程
- Linux下的多线程编程
- Linux下的多线程编程
- Linux下的多线程编程
- MySql Server版启动批处理
- STM8S 中断唤醒,定时唤醒,窗口看门狗
- Android ListView Item ContextMenu
- linux下的网络编程
- js常用正则表达式
- linux下的多线程
- 十个开源的Javascript框架
- 文件编程
- Ubuntu Unity快捷键
- C++中extern “C”含义深层探索
- execCommand全集
- PopupWindow
- 操作系统内存管理机制
- Nullable<T> 的实现