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