C++ 多线程编写器:使用cpp的并发问题

C++ 多线程编写器:使用cpp的并发问题,c++,concurrency,C++,Concurrency,我正在尝试构建一个可以写入单个文件的库,并且能够在多线程环境中工作。这些要求是: 写入文件时不会出现并发问题 线程的处理顺序并不重要 库应该是非阻塞的,即写入和刷新函数将在写入给定缓冲区之前返回 以下是我目前掌握的情况: int write2device(char *buffer, int length) { Task * task = new Task(id++,buffer,length); pthread_t * thread = new pthread_t; Ar

我正在尝试构建一个可以写入单个文件的库,并且能够在多线程环境中工作。这些要求是:

  • 写入文件时不会出现并发问题
  • 线程的处理顺序并不重要
  • 库应该是非阻塞的,即写入和刷新函数将在写入给定缓冲区之前返回
  • 以下是我目前掌握的情况:

    int write2device(char *buffer, int length) {
        Task * task = new Task(id++,buffer,length);
        pthread_t * thread = new pthread_t;
        Argument * arg = new Argument; //A sturct with pthread_t and task fields
        arg->task = task;
        arg->thread = thread;
        pthread_create(thread,NULL,deamonWrite,arg);
        return 0;
    }
    
    void wait(Argument * arg) {
        //manager is a singleton class that handles the threads database and related
        //issues
        manager->pushDeamon(arg->thread);
        manager->lock(arg->task->getId()); //mutex - only one thread can write
    }
    
    void * deamonWrite(void * arg) {
        Argument * temp = (Argument *) arg;
        wait(temp);
        //critical section
        //will add signal() later
        return NULL;
    }
    
    其思想是,对于每个调用write2device的线程,我都会打开一个运行deamonWrite()的线程。此函数的结构为wait()->critical section->signal()。 在等待中,如果其他人正在编写,我将(尚未完成)挂起该线程,以便用户不会等到它完成编写

    我有两个问题:

  • 如何实现互斥锁(lock函数)?我知道这一定是一个原子函数,因为几个线程试图获取锁可能会导致混乱
  • 我的总体结构正确吗

  • 我是新的并发,并将感谢任何想法在这个问题上-谢谢

    任务
    结构推送到队列/向量,并从单个线程而不是每个任务的多个线程依次处理它们。唯一需要互斥锁的地方是在推拉队列时。正如Ben在评论中正确指出的,您应该离开线程同步原语的实现(互斥,关键部分)到操作系统和/或允许使用的任何系统API。

    任务
    结构推送到队列/向量,并从单个线程而不是每个任务的多个线程顺序处理它们。唯一需要互斥锁的地方是在推拉队列时。正如本在评论中正确指出的,应该将线程同步原语(互斥体、临界区)的实现留给OS和/或允许使用的任何系统API。< /P>您应该添加与您使用的语言(C或C++)对应的标签。它将吸引更多的视图=>更多的答案。您最好将
    任务
    结构推送到一个队列/向量,并从单个线程顺序处理它们,而不是针对每个任务单独处理多个线程。唯一需要互斥锁的地方是推到队列时。@IRobot,这是个好主意answer@Ben,你的意思是我应该把它贴出来作为答案吗?它只解决了他两个问题中的第二个,因此我认为发表评论更合适。我建议您熟悉(我假设是Unix)threads API,如下所示:谁是您的老师?并发是一个非常深的主题。你应该添加与你使用的语言对应的标签(C或C++)。它将吸引更多的视图=>更多的答案。您最好将
    任务
    结构推送到一个队列/向量,并从单个线程顺序处理它们,而不是针对每个任务单独处理多个线程。唯一需要互斥锁的地方是推到队列时。@IRobot,这是个好主意answer@Ben,你的意思是我应该把它贴出来作为答案吗?它只解决了他两个问题中的第二个,因此我认为发表评论更合适。我建议您熟悉(我假设是Unix)threads API,如下所示:谁是您的老师?并发是一个非常深刻的主题。到目前为止,正确的方法是。为每一篇文章创建一个新的线程是一个糟糕的想法,我想知道它是从哪里来的。某个地方有一本教科书,或一套相同的教科书,上面写着“要使用线程,你必须用你的数据作为参数创建一个线程,让它运行,然后让它返回终止。要获得额外分数,请使用“加入”为您的应用程序增加更多开销。请有人把这些教科书收集起来烧掉,最好把它们堆在木桩周围,把作者绑在木桩上。到目前为止,这是正确的做法。为每一篇文章创建一个新的线程是一个糟糕的想法,我想知道它是从哪里来的。某个地方有一本教科书,或一套相同的教科书,上面写着“要使用线程,你必须用你的数据作为参数创建一个线程,让它运行,然后让它返回终止。要获得额外分数,请使用“加入”为您的应用程序增加更多开销。请有人把这些教科书收集起来烧掉,最好是堆在木桩周围,把作者绑在上面。