#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;
}
linux 下c++多線程的簡單實現
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.