linux 下c++多線程的簡單實現

#include <iostream>
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
using namespace std;
typedef unsigned long int abc ;
abc ID[3];
pthread_mutex_t lock;
class data
{
public :
    int Left;
    int right;
    int value;
    data()
    {
         Left=0;
         right=0;
         value=0;
    }
};
void*add(void *data1)
{
for (int i=0; i<2; i++)
    {
            pthread_mutex_lock(&lock);
            /*********************************************
             作用:此處上鎖,保證參數的唯一性
             線程調用該函數讓互斥鎖上鎖,
             如果該互斥鎖已被另一個線程鎖定和擁有,
             則調用該線程將阻塞,直到該互斥鎖變爲可用爲止。
             成功返回0,否則均錯誤。
            ********************************************/
            ((data*)data1)->value=  ((data*)data1)->Left+  ((data*)data1)->right;
            ((data*)data1)->Left++;
            ((data*)data1)->right++;
            printf("Thread1:value = %d\n",((data*)data1)->value);
        pthread_mutex_unlock(&lock);
        /****************************************************
        與pthread_mutex_lock成對存在。釋放互斥鎖
        ***************************************************/
        sleep(1);  //linux c下 sleep(minute),裏面變量單位是分鐘
    }
    pthread_exit(data1);
    /************************************************
    線程通過執行此函數,終止執行。返回是一個空指針類型
    ************************************************/
}
void *multiplication(void *data1)
{
    for(int i=0;i<2;i++)
    {   pthread_mutex_lock(&lock);
        ((data*)data1)->value=  (((data*)data1)->Left) *  (((data*)data1)->right);
        ((data*)data1)->Left++;
        ((data*)data1)->right++;
         printf("Thread2:value = %d\n",((data*)data1)->value);
         pthread_mutex_unlock(&lock);
         sleep(1);
    }
     pthread_exit(data1);
}
void thread_create(data* data1)
{
   memset(ID,0,sizeof(ID));
   int temp=0;
   temp=pthread_create(&ID[0],NULL,add,data1);
   /************************************************
    作用:創建線程。
    第一個參數爲指向線程標識符的指針。
    第二個參數用來設置線程屬性。
    第三個參數是線程運行函數的起始地址。
    最後一個參數是運行函數的參數。
    創建線程成功返回0.
    ************************************************/
   if(temp!=0)
   {
       perror("第一條創建線程失敗:");
   }
   temp=pthread_create(&ID[1],NULL,multiplication,data1);
   if(temp!=0)
   {
        perror("第二條創建線程失敗:");
   }
}
void  thread_wait()
{
    if(ID[0] != 0)
    {
        printf("%x\n",ID[0]);
        pthread_join(ID[0], NULL);
         /***************************************
         作用:等待線程結束,使用此函數對創建的線程資源回收。
         參數1:線程id
         參數2:用戶定義的指針,用來存儲被等待線程的返回值。
         成功返回0。失敗,返回的則是錯誤號
         **************************************/
    }
    if(ID[1] != 0)
    {   printf("%x\n",ID[1]);
        pthread_join(ID[1], NULL);
    }
}
int main()
{
if(!pthread_mutex_init(&lock,NULL))
  {
      printf("互斥鎖初始化成功\n");
  }
  /********************************
  pthread_mutex_init 用於C語言函數的多線程編程中,互斥鎖的初始化
  返回值爲零則成功,其他值都爲失敗
  ********************************/
  data* data1=new data();
  thread_create(data1);
  thread_wait();
  return 0;
}

發佈了17 篇原創文章 · 獲贊 8 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章