#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++多线程的简单实现
最新推荐文章于 2025-03-02 17:24:52 发布