`
runfeel
  • 浏览: 935650 次
文章分类
社区版块
存档分类
最新评论

多线程笔记2

 
阅读更多

转发,请保持地址:http://blog.csdn.net/stalendp/article/details/9310171

以前学习过Java的多线程设计,出于对java多线程设计的熟悉,我把pthread的多线程方法按照java的习惯封装了一下,并写了几个例子,分享一下。

// ThreadHelper.h


#ifndef threadTest_ThreadHelper_h
#define threadTest_ThreadHelper_h

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

void msleep(unsigned sec) {
    usleep(sec*1000);
}

// 参考 http://stackoverflow.com/questions/1151582/pthread-function-from-a-class
class Thread {
protected:
    std::string name;
    pthread_t mythread;
    pthread_mutex_t mymutex;
    pthread_cond_t mycond;
    
protected:
    virtual void* run() = 0;
public:
    Thread() {
        pthread_mutex_init(&mymutex, NULL);
        pthread_cond_init(&mycond, NULL);
        char msg[50];
        sprintf(msg, "%ld", time(NULL));
        name = msg;
    }
    
    Thread(const char* _name) : name(_name) {
        pthread_mutex_init(&mymutex, NULL);
        pthread_cond_init(&mycond, NULL);
    }
    
    virtual ~Thread() {
        pthread_mutex_destroy(&mymutex);
        pthread_cond_destroy(&mycond);
    }
    
    const char* getName() {
        return name.c_str();
    }
    
    void start() {
        if ( pthread_create( &mythread, NULL, _run, this) ) {
            printf("error creating thread.");
            abort();
        }
    }
    
private:
    static void* _run(void* This) {
        return ((Thread*) This)->run();
    }
};

class Synchronizable {
protected:
    pthread_mutex_t mymutex;
    pthread_cond_t mycond;
    
public:
#define LOCK_BEGIN  pthread_mutex_lock(&mymutex)
#define LOCK_END    pthread_mutex_unlock(&mymutex)
#define WAIT        pthread_cond_wait(&mycond, &mymutex)
#define NOTIFY_ALL  pthread_cond_broadcast(&mycond);
    
public:
    Synchronizable() {
        pthread_mutex_init(&mymutex, NULL);
        pthread_cond_init(&mycond, NULL);
    }
    
    virtual ~Synchronizable() {
        pthread_mutex_destroy(&mymutex);
        pthread_cond_destroy(&mycond);
    }

};

#endif

然后给出一个生产消费者模式的例子:

#ifndef threadTest_PtProducerConsumer_h
#define threadTest_PtProducerConsumer_h

#include "ThreadHelper.h"

#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <time.h>
#include <string>
#include <vector>
#include <sstream>

// 生产者必须将数据安全地交给消费者。虽然只是这样的问题,但当生产者与消费者
// 在不同的线程上运行时,两者的处理速度差将是最大的问题。当消费者要取数据时
// 生产者还没有建立出数据,或是生产者建立出数据时消费者的状态还没办法接受数据等。
// Producer-Consumer Pattern是在生产者和消费者之间加入一个“桥梁参与者”。
// 以这个桥梁参与者缓冲线程之间的处理速度差。

class Table : Synchronizable {
private:
    int tail, head, count;
    std::vector<std::string> buffer;
    
public:
    Table(int _count) : tail(0), head(0), count(0) {
        buffer.resize(_count);
    }
    
    void put(const char* cake) {
        LOCK_BEGIN;
        while (count >= buffer.size()) {
            printf("!!!TABLE IS FULL!!!\n");
            WAIT;
        }
        buffer[tail] = cake;
        tail = (tail+1) % buffer.size();
        count++;
        NOTIFY_ALL;
        printf("puts  %s -- size %d\n", cake, count);
        LOCK_END;
    }
    
    const char* take() {
        LOCK_BEGIN;
        while (count<=0) {
            printf("!!!NO MORE CAKES!!!\n");
            WAIT;
        }
        std::string cake = buffer[head];
        head = (head+1) % buffer.size();
        count--;
        NOTIFY_ALL;
        printf("takes %s -- size %d\n", cake.c_str(), count);
        LOCK_END;
        return cake.c_str();
    }
};

static int mid;

class MakerThread: public Thread {
private:
    Table* table;
public:
    MakerThread(const char* _name, Table* _table) : Thread(_name) {
        this->table = _table;
        srand((unsigned)time(NULL));
    }
    void* run() {
        while (true) {
            msleep(rand()%1000);
            std::stringstream ss;
            ss << "[Cake No." << nextId() << " by " << getName()  << "]";
            table->put(ss.str().c_str());
        }
        return NULL;
    }
    
    static int nextId() {
        return mid++;
    }
};

class EaterThread: public Thread {
private:
    Table* table;
public:
    EaterThread(const char* _name, Table* _table) : Thread(_name) {
        this->table = _table;
    }
    
    void* run() {
        while (true) {
            const char* cake = table->take();
//            printf("%s\n", cake);
            msleep(rand()%1000);
        }
        return NULL;
    }
};

void pcRun() {
    Table* table = new Table(3);  // 建立可以放置3个蛋糕的桌子
    (new MakerThread("MakerThread-1", table))->start();
    (new MakerThread("MakerThread-2", table))->start();
    (new MakerThread("MakerThread-3", table))->start();
    (new EaterThread("EaterThread-1", table))->start();
    (new EaterThread("EaterThread-2", table))->start();
    (new EaterThread("EaterThread-3", table))->start();
    sleep(90);
    printf("hello producer consumer");
}

#endif


参考:《Java多线程设计模式详解》

相关文章:http://blog.csdn.net/stalendp/article/details/9253665


分享到:
评论

相关推荐

    马士兵多线程笔记.zip

    以下是对马士兵多线程笔记的详细解析。 1. **多线程基础**:多线程是指一个应用程序中同时执行多个线程(即任务)的能力。这种并发执行可以提高系统资源的利用率,提升程序的响应速度和执行效率,特别是在多核...

    Java多线程笔记

    Java多线程笔记 Java多线程笔记是 Java 编程语言中关于多线程编程的笔记,涵盖了线程基础知识、线程优先级、线程状态、守护线程、构造线程、线程中断等多方面的内容。 获取简单 main 程序中的线程 在 Java 中,...

    java多线程笔记

    Java线程的知识点总结。doc

    多线程学习笔记

    多线程学习笔记 iOS开发中,多线程是一种常见的技术手段,用于优化应用程序的性能,提升用户体验。多线程的核心是让程序能够并发地执行多个任务,合理地利用设备的计算能力,尤其是在拥有多个核心的处理器上。 ...

    java学习笔记2(多线程)

    java学习笔记2(多线程)java学习笔记2(多线程)

    马士兵多线程训练营笔记

    马士兵是一位知名的IT教育专家,他的多线程训练营笔记深入浅出地讲解了这一主题,帮助开发者理解并掌握多线程的精髓。 多线程允许一个程序中有多个执行流同时运行,这样可以提高应用程序的效率和响应性。在Java中,...

    多线程笔记.md

    多线程笔记

    JAVA 多线程学习笔记

    这篇学习笔记将深入探讨Java多线程的核心概念、实现方式以及相关工具的使用。 一、多线程基础 1. 线程与进程:在操作系统中,进程是资源分配的基本单位,而线程是程序执行的基本单位。每个进程至少有一个主线程,...

    张孝祥Java多线程与并发库高级应用笔记

    ### 张孝祥Java多线程与并发库高级应用笔记概览 #### 一、Java多线程技术的重要性与挑战 Java线程技术是软件工程领域不可或缺的一部分,尤其在底层编程、Android应用开发以及游戏开发中,其重要性不言而喻。然而,...

    java多线程笔记全手打

    通过阅读`多线程笔记.doc`和运行`threadDemo`示例代码,你可以对Java多线程有更深入的理解,并能够在实际项目中灵活运用这些知识,解决并发问题。同时,博客地址提供了更多详细内容,可以帮助你进一步探索和实践。

    C# 多线程笔记和示例讲解

    以下是对"C#多线程笔记"中可能包含的知识点的详细解释。 1. **线程基础**: - **什么是线程**:线程是程序执行的最小单元,每个进程至少有一个线程,负责执行程序代码。 - **主线程与子线程**:主线程是程序的...

    Java多线程详解(超详细)_狂神说笔记完整版_项目代码_适合小白随课程学习

    Java多线程详解 在Java编程中,多线程是一种重要的技术,它使得程序能够同时执行多个任务,提高系统的效率和响应性。本教程将详细讲解Java中的多线程概念,包括线程的创建、状态、同步以及高级主题,旨在帮助初学者...

    多线程笔记

    ### 多线程基础知识与应用 #### 一、线程的创建方式 在Java中,创建线程主要有两种方式:一种是通过继承`Thread`类;另一种是通过实现`Runnable`接口。 1. **继承Thread类** ```java public class MyThread ...

    java多线程笔记分享

    java多线程笔记分享

    C#多线程笔记

    ### C#多线程知识点详解 #### 一、线程与窗体间的交互 在C#编程中,每个窗体通常都运行在一个独立的线程上。这意味着如果一个应用程序包含多个窗体,那么这些窗体将分别运行在各自的线程之上。当需要实现不同窗体...

    Python3 多线程笔记

    ### Python3多线程知识点详解 #### 一、线程基础 **线程状态** 在探讨Python3中的多线程之前,我们首先需要理解线程的基本状态及其转换过程。 - **新建**: 当一个线程被创建后,它最初处于新建状态。 - **就绪**...

    多线程笔记.docx

    Java多线程是Java编程中不可或缺的部分,它允许程序同时执行多个任务,从而提升程序的效率和CPU的利用率。在Java中,线程是程序执行的最小单位,而进程则是资源分配的基本单位。一个进程可以包含一个或多个线程,...

    多线程程序设计——笔记

    多线程程序设计笔记 多线程程序设计是计算机科学中的一门重要技术,旨在提高程序的执行效率和响应速度。多线程程序设计学习笔记,内容详尽、实用,本笔记中将详细介绍多线程程序设计的基本概念、线程的创建和管理、...

Global site tag (gtag.js) - Google Analytics