Linux C/C++ thread(執行緒/執行序/線程)

Linux C/C++ thread(執行緒/執行序/線程)

Linux C/C++ thread(執行緒/執行序/線程)


GITHUB:https://github.com/jash-git/Jash_LinuxC/tree/master/Linux%20C%20thread(%E5%9F%B7%E8%A1%8C%E7%B7%92_%E7%B7%9A%E7%A8%8B)


01.example.c-最簡單的thread範例,重點在於如何建立和等待thread結束


02.sum_by_thread.c-重點在於參數傳入thread中+利用全域變數達到thread和主程式資料共用


03.thread_example.c-重點在於利用全域變數達到thread和主程式資料共用+利用pthread_mutex_t達到thread之間的互鎖功能(實作兩個thread一起處理同一份工作)


04.jash_thread.cpp-證明pthread_mutex_t可以同時用在多個thread之間的互鎖功能,但是可能會有同一筆資料重覆運算浪費CPU


05.jash_thread01.cpp-將所有thread函數整合成一個,另外用pthread_self函數來分別是哪一個thread在工作


06.jash_thread02.cpp-成功傳遞變數到thread函數,原來要透過 sleep(1);//延遲線程建立速度,否則無法正確傳遞變數


07.jash_thread03.cpp-成功傳遞變數到thread函數,原來要透過 sleep(1);//延遲線程建立速度,否則無法正確傳遞變數+把for迴圈改成while迴圈防堵重複執行問題


jash_thread03.cpp

#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <stdio.h>
#include <sys/time.h>
#include <string.h>
#define MAX 20

pthread_t thread[4];
pthread_mutex_t mut;
int number;
int i;
void *thread_fun(void *arg)
{
	pthread_t pid = pthread_self();
	int value = *(int *)arg;
	long count=pid;
	while(i<MAX)
	{
		pthread_mutex_lock(&mut);
			if(i<MAX)
			{
				number++;
			}
		    i++;
		pthread_mutex_unlock(&mut);
		printf("thread %d's i=%d: number = %d\n",value,(i-1),number);
		sleep(1);
	}
	printf("thread %d's pid=%ld:主函數在等我完成任務嗎?\n",value,count);
	pthread_exit(NULL);
}
void thread_create(void)
{
	int temp;
	int j[4];//要傳遞的資料閉需要式獨立變數
	memset(&thread, 0, sizeof(thread));          //comment1
	/*創建線程*/
	for(int i=0;i<4;i++)
	{
		j[i]=i+1;
		if((temp = pthread_create(&thread[i], NULL, thread_fun, &j[i]))!= 0)       //comment2
		{
			printf("線程%d創建失敗!\n",i);
		}
		else
		{
			printf("線程%d被創建\n",i);
		}
		sleep(1);//延遲線程建立速度,否則無法正確傳遞變數
	}
}
void thread_wait(void)
{
	/*等待線程結束*/
	for(int i=0;i<4;i++)
	{
		if(thread[i] !=0)
		{//comment4
			pthread_join(thread[i],NULL);
			printf("線程%d已經結束\n",i);
		}
	}
}
int main()
{
		number=0;
        /*用是認屬性初始化互斥鎖*/
        i=0;
        pthread_mutex_init(&mut,NULL);
        printf("我是主函數哦,我正在創建線程,呵呵\n");
        thread_create();
        printf("我是主函數哦,我正在等待線程完成任務是,呵呵\n");
        thread_wait();
        return 0;
}
/*
http://www.tutorialspoint.com/compile_c_online.php
sh-4.2# gcc -o main *.c -pthread -std=c99            
sh-4.2# main                                         
我是主函數哦,我正在創建線程,呵呵                                  
線程0被創建                                               
thread 1's i=0: number = 1  
thread 1's i=1: number = 2                           
線程1被創建                                               
thread 2's i=2: number = 3                           
thread 1's i=3: number = 4                           
thread 2's i=4: number = 5                           
thread 3's i=5: number = 6                           
線程2被創建                                               
thread 1's i=6: number = 7                           
thread 3's i=7: number = 8                           
thread 2's i=8: number = 9                           
線程3被創建                                               
thread 4's i=9: number = 10                          
thread 1's i=10: number = 11                         
thread 3's i=11: number = 12                         
thread 2's i=12: number = 13                         
我是主函數哦,我正在等待線程完成任務是,呵呵                             
thread 4's i=13: number = 14                         
thread 1's i=14: number = 15                         
thread 3's i=15: number = 16                         
thread 2's i=16: number = 17                         
thread 4's i=17: number = 18                         
thread 1's i=18: number = 19                         
thread 3's i=19: number = 20                         
thread 2's pid=140404842510080:主函數在等我完成任務嗎?         
thread 4's pid=140404825724672:主函數在等我完成任務嗎?         
thread 1's pid=140404850902784:主函數在等我完成任務嗎?         
thread 3's pid=140404834117376:主函數在等我完成任務嗎?         
線程0已經結束                                              
線程1已經結束                                              
線程2已經結束                                              
線程3已經結束 
*/

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *