一个多线程编写器:使用cpp的并发问题

时间:2012-05-05 20:15:24

标签: c++ concurrency

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

  1. 写入文件时不会出现并发问题。
  2. 处理线程的顺序并不重要。
  3. 库应该是非阻塞的,即写入和刷新函数将在写入给定缓冲区之前返回。
  4. 这是我到目前为止所拥有的:

    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() - >的结构。临界区 - >信号()。 在等待中,如果其他人在写,我将(尚未完成)暂停该线程,以便用户不会等到写完之后。

    我有两个问题:

    1. 如何实现互斥锁(锁定功能)?我知道这必须是一个原子函数,感觉几个试图获取锁的线程可能会导致混乱。
    2. 我的总体结构是否正确?
    3. 我是并发新手,非常感谢对此事的任何想法 - 谢谢!

1 个答案:

答案 0 :(得分:4)

Task结构推送到队列/向量,并从单个线程顺序处理它们,而不是分别为每个任务处理多个线程。您需要互斥锁的唯一地方是推送和拉出队列。正如Ben在评论中正确指出的那样,你应该将线程同步原语(mutex,critical section)的实现留给操作系统和/或你允许使用的任何系统API。