1、thread_create.c
创建多线程。
#include <stdio.h>
#include <pthread.h>
void* myThread1(void)
{
int i;
for(i=0; i<10; i++)
{
printf("This is the 1st pthread \n");
sleep(1);
}
}
void* myThread2(void)
{
int i;
for(i=0; i<10; i++)
{
printf("This is the 2st pthread \n");
sleep(1);
}
}
int main()
{
int i =0;
int 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_create(&id2, NULL, (void*)myThread2,NULL);
if(ret)
{
printf("Create pthread2 error \n");
return 1;
}
//以阻塞的方式等待id1指定的线程结束。
pthread_join(id1, NULL);
pthread_join(id2, NULL);
return 0;
}
2、thread_id.c
显示线程ID
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
int a=1;
void* create(void *arg)
{
printf("new thread ... \n");
//输出线程ID
printf("This thread's id is %u ...\n",(unsigned int)pthread_self());
//输出进程ID,该ID与main的进程ID号相同
printf("This process pid is %d ...\n",getpid());
return (void*)0;
}
int main(int argc,char* argv[])
{
pthread_t id;
int error;
int* tmp = 10;
int a = 5;
printf("a= %d from main \n",a);
error = pthread_create(&id,NULL,create,NULL);
sleep(1);
printf("The main process pid is %d ...\n",getpid());
sleep(1);
return 0;
}
3、thread_join.c
以阻塞的方式等待thread指定的线程结束。
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
int a=1;
void* create(void *arg)
{
int i ;
for(i=0;i < 5;i++)
{
sleep(2);
printf("this is in thread : %d ...\n",i);
}
return NULL;
}
int main(int argc,char* argv[])
{
pthread_t id;
int error;
int* tmp = 10;
int i;
printf("a= %d from main \n",a);
error = pthread_create(&id,NULL,create,NULL);
//pthread_join(id,NULL);//以阻塞的方式等待id1指定的线程结束。然后再执行下面的代码
printf("123\n");
for(i = 0; i < 5;i++)
{
sleep(1);
printf("this is in main : %d ...\n",i);
}
return 0;
}
4、thread_clean.c
线程异常退出时的资源释放。
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void* clean(void* arg)
{
printf("clean : %s\n",(char*)arg);
return 0;
}
void* fun1(void *arg)
{
printf("thread 1 start ...\n");
pthread_cleanup_push((void*)clean,"thead 1 first ...");
pthread_cleanup_push((void*)clean,"thead 1 second ...");
printf("thread 1 push complete \n");
if(arg)
{
return (void*)1;//return返回时,不执行push的clean函数
}
pthread_cleanup_pop(0);
pthread_cleanup_pop(0);
return (void*)1;
}
void* fun2(void *arg)
{
printf("thread 2 start ...\n");
pthread_cleanup_push((void*)clean,"thead 2 first ...");
pthread_cleanup_push((void*)clean,"thead 2 second ...");
printf("thread 2 push complete \n");
if(arg)
{
pthread_exit((void*)1);
}
pthread_cleanup_pop(0);//该函数参数为0,并且在线程异常退出或者程序调用pthread_exit的时候(不包括return),会执行push进来的clean函数
pthread_cleanup_pop(0);
return (void*)1;
}
int main(int argc,char* argv[])
{
pthread_t id1,id2;
int error;
int* tmp = 10;
error = pthread_create(&id1,NULL,fun1,"hello");
if(error !=0)
{
printf("create thread 1 error\n");
}
pthread_join(id1,NULL);
error = pthread_create(&id2,NULL,fun2,"hello");
if(error !=0)
{
printf("create thread 2 error\n");
}
//pthread_join(id1,NULL);
pthread_join(id2,NULL);
return 0;
}
5、thread_exit.c
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
int a=1;
void* create(void *arg)
{
printf("new thread ... \n");
return (void*)8;
}
int main(int argc,char* argv[])
{
pthread_t id;
int error;
void* temp;
error = pthread_create(&id,NULL,create,NULL);
if(error)
{
printf("thread is not created ... \n");
}
error = pthread_join(id,&temp);//temp存储了线程返回值
if(error)
{
printf("thread is not exit \n");
return -2;
}
printf("thread is exit %d ...",(int)temp);
return 0;
}
6、thread_int.c
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void* create(void *arg)
{
printf("this arg is %d \n",(int*)arg);
return (void*)0;
}
int main(int argc,char* argv[])
{
pthread_t id;
int error;
int* tmp = 10;
char* ch = "hello world";
error = pthread_create(&id,NULL,create,(void*)tmp);
sleep(1);
printf("prhead_create is created ...\n");
return 0;
}
7、thread_share.c
线程与进程共享数据段
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
int a=1;
void* create(void *arg)
{
printf("new thread ... \n");
printf("a=%d from pthread...\n",a);
a++;
return (void*)0;
}
int main(int argc,char* argv[])
{
pthread_t id;
int error;
int* tmp = 10;
int a = 5;
printf("a= %d from main \n",a);
error = pthread_create(&id,NULL,create,NULL);
sleep(1);
printf("prhead_create is created ...\n");
printf("a= from main2 ... \n%d",a);
return 0;
}
编译的时候要注意下,加参数-lpthread
g++ demo.cpp -lpthread