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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值