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

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

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

 

 

#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 *p)
{
pthread_t pid = pthread_self();
long count=pid;
for (i = 0; i < MAX; i++)
{
printf("thread %ld: %d\n",count,i);
pthread_mutex_lock(&mut);
if(i<MAX)
{
number++;
printf("thread %ld: number = %d\n",count,number);
}
pthread_mutex_unlock(&mut);
sleep(1);
}
printf("thread %ld:主函數在等我完成任務嗎?\n",count);
pthread_exit(NULL);
}
void thread_create(void)
{
int temp;
memset(&thread, 0, sizeof(thread));          //comment1
/*創建線程*/
for(int i=0;i<4;i++)
{
if((temp = pthread_create(&thread[i], NULL, thread_fun, NULL))!= 0)       //comment2
{
printf("線程%d創建失敗!\n",i);
}
else
{
printf("線程%d被創建\n",i);
}
}
}
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;
/*用��認屬性初始化互斥鎖*/
pthread_mutex_init(&mut,NULL);
printf("我��主函數哦,我正在創建線程,呵呵\n");
thread_create();
printf("我��主函數哦,我正在等待線程完成任務��,呵呵\n");
thread_wait();
return 0;
}





 




One thought on “Linux C thread-05.將所有thread函數整合成一個,另外用pthread_self函數來分別是哪一個thread在工作

  1. 2015/01/18 備註
    利用[pthread_t pid = pthread_self();]除以執行緒各數取餘數,也可以達到不用等待個字處理同一塊全域變數資料
    例如只開三個thread且全域變數陣列有20筆資料要處理,所以一開始先計算pid%3=0、1、2,之後只要讓每一個thread抓取(pid%3+3的倍數)即可分開每一個執行緒的工作範圍
    thread1=0,3,6,9,12,15,18
    thread2=1,4,7,10,13,16,19
    thread3=2,5,8,11,14,17

發表迴響

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