Windows下使用Dev-C++开发基于pthread.h的多线程程序实例

yizhihongxing

接下来我为你详细讲解如何在Windows下使用Dev-C++开发基于pthread.h的多线程程序实例。

准备工作

安装Dev-C++

在开始之前,我们首先需要安装Dev-C++,可以从官网 https://sourceforge.net/projects/orwelldevcpp/ 下载最新的Dev-C++安装包。

安装pthread库

接下来我们需要安装pthread库。在Windows下我们可以使用MinGW-w64工具包进行安装。

下载地址:https://sourceforge.net/projects/mingw-w64/

安装完成后在MinGW-w64的安装目录下的bin文件夹内找到mingw-w64.bat文件,双击打开。在命令行窗口输入以下命令安装pthread库:

mingw-w64-x86_64-posix-seh-gcc -v -E -x c - -mthreads < /dev/null 2>&1 | grep -q -F "_beginthreadex"

完成安装之后在C:\Program Files\mingw-w64下会出现两个子文件夹:mingw32和mingw64。如果是64位系统需要使用mingw64文件夹,如果是32位系统则需要使用mingw32文件夹。我们将使用的是mingw64文件夹下的库文件。在该目录下找到lib文件夹中的pthreadGC2.dll和libpthreadGC2.a两个文件,并将其拷贝到Dev-C++安装目录下的lib文件夹中。

配置编译器

打开Dev-C++,依次点击菜单栏上的Tools -> Compiler Options,在弹出的窗口中选择General选项卡,在"Programs"栏中选择"Executable Path",将其中的路径修改为MinGW-w64的bin目录,比如"C:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin"。

接着选择"Directories"选项卡,在"Include Directories"中添加pthread的头文件目录,这里我的路径是"C:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\x86_64-w64-mingw32\include"。

最后在"Linker"选项卡中,在"Libraries"栏中添加"pthread"库,这里我的路径是"C:\Dev-Cpp\lib\libpthreadGC2.a"。

第一个示例程序

功能说明

第一个示例程序是一个简单的并行计算,它创建10个线程,每个线程计算从1到100的和,最终把所有线程计算结果加起来输出。

代码示例

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

#define THREAD_COUNT 10 // 线程数量
#define PER_THREAD_COUNT 10 // 每个线程计算的次数

void *thread_func(void *argp)
{
    int *ret_value = (int *)malloc(sizeof(int));
    *ret_value = 0;
    int index = *(int *)argp;

    int start = PER_THREAD_COUNT * index + 1;
    int end = PER_THREAD_COUNT * (index + 1);

    for (int i = start; i <= end; i++)
    {
        *ret_value += i;
    }
    return (void *)ret_value;
}

int main(int argc, char *argv[])
{
    int sum = 0;
    pthread_t threads[THREAD_COUNT];
    void *retvals[THREAD_COUNT];

    for (int i = 0; i < THREAD_COUNT; i++)
    {
        int *argp = (int *)malloc(sizeof(int));
        *argp = i;
        pthread_create(&threads[i], NULL, thread_func, (void *)argp);
    }

    for (int i = 0; i < THREAD_COUNT; i++)
    {
        pthread_join(threads[i], &retvals[i]);
        sum += *(int *)retvals[i];
        free(retvals[i]);
    }

    printf("Sum is %d\n", sum);

    return 0;
}

代码说明

代码中创建了一个thread_func函数作为线程执行函数,在函数中传入计算的起始值和终止值参数,计算从起始值到终止值的和,并将其存储在堆上分配的内存中,最后返回这个内存地址。在主函数中利用pthread_create创建多个线程,利用pthread_join等待线程结束,最终将所有线程计算值的和输出。

第二个示例程序

功能说明

第二个示例程序是一个简单的生产者-消费者模型,它利用条件变量和互斥锁来实现生产和消费的同步。

代码示例

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

#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE];    // 缓冲区
int current_pos = 0;        // 当前缓冲区位置
int product_num = 0;        // 待生产产品数量
int consume_num = 0;        // 已消费产品数量

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;    // 互斥锁
pthread_cond_t produce_cond = PTHREAD_COND_INITIALIZER;    // 生产者条件变量
pthread_cond_t consume_cond = PTHREAD_COND_INITIALIZER;    // 消费者条件变量

// 生产者线程
void *producer_thread(void *param)
{
    while (product_num >= 0)
    {
        pthread_mutex_lock(&mutex);
        while (current_pos == BUFFER_SIZE)
        {
            // 等待消费者消费
            pthread_cond_wait(&consume_cond, &mutex);
        }

        buffer[current_pos] = product_num;
        printf("Producer[%d] puts %d at position %d\n", pthread_self(), product_num, current_pos);
        current_pos++;
        product_num++;

        pthread_cond_signal(&produce_cond);    // 唤醒消费者
        pthread_mutex_unlock(&mutex);
        sleep(1);
    }

    return NULL;
}

// 消费者线程
void *consumer_thread(void *param)
{
    while (consume_num < product_num)
    {
        pthread_mutex_lock(&mutex);
        while (current_pos == 0)
        {
            // 等待生产者生产
            pthread_cond_wait(&produce_cond, &mutex);
        }

        int value = buffer[current_pos - 1];
        printf("Consumer[%d] gets %d from position %d\n", pthread_self(), value, current_pos - 1);
        current_pos--;
        consume_num++;

        pthread_cond_signal(&consume_cond);    // 唤醒生产者
        pthread_mutex_unlock(&mutex);
        sleep(1);
    }

    return NULL;
}

int main(int argc, char **argv)
{
    pthread_t producer_tid, consumer_tid;

    // 创建生产者线程和消费者线程
    pthread_create(&producer_tid, NULL, producer_thread, NULL);
    pthread_create(&consumer_tid, NULL, consumer_thread, NULL);

    // 等待生产者和消费者线程结束
    pthread_join(producer_tid, NULL);
    pthread_join(consumer_tid, NULL);

    printf("All done!\n");

    return 0;
}

代码说明

代码中创建了一个生产者线程和一个消费者线程,生产者线程每秒生产一个产品并将其存入缓冲区中,消费者线程每秒取出一个产品并将其从缓冲区中移除。在开始时,product_num的值为0,代表生产者需要生产的产品数量;consume_num的值为0,代表消费者已经消费的产品数量。缓冲区的大小为10。

当生产者线程生产完一个产品后,将其放入缓冲区中,并将current_pos加1。如果缓冲区已满,则生产者线程进入等待状态,等待消费者线程消费完一个产品后唤醒。当消费者线程取出一个产品后,将其从缓冲区中移除,并将current_pos减1。如果缓冲区为空,则消费者线程进入等待状态,等待生产者线程生产一个新产品后唤醒。

需要注意的是,在访问缓冲区时需要加锁(mutex),以保证每个线程访问缓冲区的唯一性;在等待条件变量时需要解锁(mutex),以便其他线程可以访问和修改缓冲区的元素。在某个线程修改缓冲区的元素时,该线程需要修改current_pos的值,并将mutex解锁,以使其他线程能够访问缓冲区的元素。在线程执行完毕之后,需要调用pthread_join等待线程结束,并释放线程的资源。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Windows下使用Dev-C++开发基于pthread.h的多线程程序实例 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • 彻底搞懂java并发ThreadPoolExecutor使用

    那我来为您详细讲解下“彻底搞懂java并发ThreadPoolExecutor使用”的完整攻略。 前置知识 在了解 ThreadPoolExecutor 的使用之前,有一些前置知识需要掌握: 线程的基本概念和线程池的概念 线程池的常见类型及其应用场景 线程池的工作原理和执行流程 线程池的关键参数及使用方式 如果您对以上内容不熟悉,首先需要学习一下相关知识点。…

    多线程 2023年5月16日
    00
  • golang并发ping主机的方法

    首先我们需要了解一下”并发ping主机的方法”的概念。 将多个ping请求并发地发送给多个主机,可以达到加快检测速度,提高并发性能的目的。在golang中,可以使用goroutine和channel等机制来实现并发ping主机的方法。 以下是一份完整的攻略: 1. 准备工作 准备一个可以进行ping测试的服务器,并确保目标主机有响应。 在golang中,需要…

    多线程 2023年5月17日
    00
  • python基础之并发编程(一)

    以下是“python基础之并发编程(一)”的完整攻略: 什么是并发编程 并发指的是程序的多个部分可以同时执行的能力。在计算机领域中,指的是通过多个线程或进程实现并行计算和任务处理。 并发编程是指在同一时间段内处理多个计算任务的编程方式,它涉及到多个线程或进程之间的协调和通信。在Python中,使用多线程和多进程都能实现并发编程。 Python中的多线程并发编…

    多线程 2023年5月17日
    00
  • 深入解析Java并发程序中线程的同步与线程锁的使用

    深入解析Java并发程序中线程的同步与线程锁的使用 Java是一门多线程语言,因此并发编程是Java编程中的一个重要方面。当多线程并发访问共享资源时,可能会出现线程安全问题,这时就需要用到线程同步和线程锁。本文将深入讲解Java并发程序中线程的同步与线程锁的使用,以及如何解决线程安全问题。 线程同步 线程同步是指多个线程在访问共享资源时,通过某种方式保证同一…

    多线程 2023年5月16日
    00
  • Python多进程并发与多线程并发编程实例总结

    Python多进程并发与多线程并发编程是一个非常广泛且实用的话题。本文将为读者提供两个示例,展示如何在Python中使用多线程和多进程来实现并发编程,并给出一个完整的攻略。 一、多线程并发编程实例 多线程并发编程是指同时使用多个线程来共同完成一个任务。以下是一个简单的多线程并发编程实例: import threading def job(num): prin…

    多线程 2023年5月16日
    00
  • MySQL多版本并发控制MVCC深入学习

    MySQL多版本并发控制(MVCC)深入学习 介绍 MySQL是最流行的开源关系型数据库之一。在高并发环境下,MySQL 的MVCC(多版本并发控制)是保证数据一致性和性能的重要机制。本文将深入讲解MySQL的MVCC机制,介绍其实现原理和应用场景,并提供实际示例。 MVCC机制概述 MVCC是一种高并发的事务处理机制。实现MVCC的关键是:每个MySQL事…

    多线程 2023年5月16日
    00
  • Java多线程之线程池七个参数详解

    让我们来详细讲解一下“Java多线程之线程池七个参数详解”。 Java多线程之线程池七个参数详解 什么是线程池? 在编写多线程程序时,频繁的创建和销毁线程开销很大,容易导致系统崩溃。为了避免这种情况,我们可以使用线程池来复用一定数量的线程,并管理它们的执行。 线程池七个参数 线程池有七个参数,需要我们在创建线程池时设置。 corePoolSize:核心线程数…

    多线程 2023年5月17日
    00
  • 浅谈Java并发中的内存模型

    浅谈Java并发中的内存模型 在Java并发编程中,了解Java内存模型(Java Memory Model,简称JMM)是非常必要的。因为JMM规定了不同线程之间访问共享变量的规则,影响了程序在并发执行时的正确性和性能。下面我们就来详细讲解一下Java并发中的内存模型。 Java内存模型简介 Java内存模型是在JDK 1.2中引入的,它描述了Java虚拟…

    多线程 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部