我正在尝试构建一个可以写入单个文件的库,并且可以在多线程环境中工作。要求是:
这是我到目前为止所拥有的:
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() - >的结构。临界区 - >信号()。 在等待中,如果其他人在写,我将(尚未完成)暂停该线程,以便用户不会等到写完之后。
我有两个问题:
我是并发新手,非常感谢对此事的任何想法 - 谢谢!
答案 0 :(得分:4)
将Task
结构推送到队列/向量,并从单个线程顺序处理它们,而不是分别为每个任务处理多个线程。您需要互斥锁的唯一地方是推送和拉出队列。正如Ben在评论中正确指出的那样,你应该将线程同步原语(mutex,critical section)的实现留给操作系统和/或你允许使用的任何系统API。