Linux程式多執行緒入門

readyao發表於2015-12-07

例項1:程式和執行緒並行輸出

/*************************************************************************
    > File Name: threadbase.c
    > Author: 
    > Mail:  
    > Created Time: 2015年12月04日 星期五 17時44分38秒
 ************************************************************************/

#include<stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <pthread.h>

/*要執行的執行緒函式*/
void *thread_routine(void *arg)
{

	printf("i am a thread, my thread id is : %ld\n", pthread_self());
	int i = 0;
	for (i = 1; i < 11; ++i){
		printf("thread i  = %d\n", i);
		fflush(stdout);
		sleep(1);
	}
	printf("thread exit\n");
}

int main()
{
	pthread_t tid;

	int ret = 0;
	ret = pthread_create(&tid, NULL, thread_routine, NULL);//建立一個執行緒
	if(ret != 0){
		printf("pthread_create error\n");
		exit(0);
	}

	int i = 0;
	for (i = 1; i < 11; ++i){
		printf("main i = %d\n", i);
		fflush(stdout);
		sleep(1);
	}

	sleep(2);//等待執行緒退出,如果執行緒還在執行,但是程式退出,那麼執行緒也會退出
	printf("parent exit\n");
	exit(0);
}


例項2:在程式中使用等待執行緒的函式和執行緒退出函式

/*************************************************************************
    > File Name: threadbase.c
    > Author: 
    > Mail:  
    > Created Time: 2015年12月04日 星期五 17時44分38秒
 ************************************************************************/

#include<stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <pthread.h>

void *thread_routine(void *arg)
{
	printf("i am a thread, my thread id is : %ld\n", pthread_self());
	int i = 0;
	for (i = 1; i < 11; ++i){
		printf("thread i  = %d\n", i);
		fflush(stdout);
		sleep(1);
	}
	sleep(3);
	printf("child exit\n");

	pthread_exit(NULL);//執行緒結束函式
}

int main()
{
	pthread_t tid;

	int ret = 0;
	ret = pthread_create(&tid, NULL, thread_routine, NULL);
	if(ret != 0){
		printf("pthread_create error\n");
		exit(0);
	}

	int i = 0;
	for (i = 1; i < 11; ++i){
		printf("main i = %d\n", i);
		fflush(stdout);
		sleep(1);
	}


	pthread_join(tid, NULL);//等待執行緒退出
	printf("parent exit\n");
	exit(0);
}


例項3:建立多個執行緒,並向執行緒傳遞資料

/*************************************************************************
    > File Name: threadbase.c
    > Author: 
    > Mail:  
    > Created Time: 2015年12月04日 星期五 17時44分38秒
 ************************************************************************/

#include<stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>

#include <pthread.h>

typedef struct Threadinfo{
	char name[64];
	int age;
	int numId;
}ThreadInfo;

int nNum, nLoop;

void *thread_routine(void *arg)
{
	int i = 0;
//	pthread_detach(pthread_self());
	ThreadInfo * p = (ThreadInfo *)arg;
	for (i = 0; i < nLoop; ++i){
		printf("thread id is :%ld, i = %d, numid is %d\n", pthread_self(), i, p->numId);
	}
	printf("child exit: %ld\n", pthread_self());
	pthread_exit(arg);
}

int main()
{
	int i = 0;
	pthread_t tidArray[200];
	ThreadInfo tmp[200];

	printf("input the number of thread:");
	scanf("%d", &nNum);
	printf("input the number of nLoop:");
	scanf("%d", &nLoop);

	int ret = 0;
	for (i = 0; i < nNum; ++i){
		memset(&tmp[i], 0, sizeof(ThreadInfo));
		tmp[i].numId= i;
		pthread_create(&tidArray[i], NULL, thread_routine, &tmp[i]);
	}

	for (i = 0; i < nNum; ++i){
		pthread_join(tidArray[i], NULL);
	}
	printf("parent exit\n");
	exit(0);
}


相關文章