我有一个代码,包含两个函数func1和func2。这两个功能的作用是一样的。继续不断读取目录并写入各自日志文件中存在的文件名。这两个函数都引用了一个常用的日志函数来写日志。我想在我的代码中使用引入线程,这样它们都可以并行运行但两者都不应该同时访问日志功能。如何实现?
答案 0 :(得分:2)
这是需要互斥锁的经典案例。
void WriteToLog(const char *msg)
{
acquire(mutex);
logfile << msg << endl;
release(mutex);
}
上述代码不会“复制并粘贴”到您的系统中,因为互斥锁是系统特定的 - 如果您使用pthread_mutex
,pthreads
将是您的选择。 C ++ 11拥有自己的互斥和线程功能,Windows有另一种变体。
答案 1 :(得分:1)
来自Sajal的评论:
尝试了pthread_create(&amp; thread1,NULL,start_opca,&amp; opca); pthread_join(thread1,NULL); pthread_create(&amp; thread2,NULL,start_ggca,&amp; ggca); pthread_join(thread2,NULL);
但问题是它会在下一个开始之前等待一个线程完成。我不希望这样。
join函数阻塞调用线程,直到你调用的线程加入为止,结束。在你的情况下,在创建第二个线程之前调用第一个线程上的join,保证第一个线程在第二个线程开始之前结束。
您应首先创建两个线程,然后将它们连接起来(而不是散布创建和两者的连接)。
此外,应该将对日志的访问提取到两者的公共代码中(日志记录功能,日志记录类等。在提取的代码中,应使用互斥锁保护日志访问。
如果你有一个支持c ++ 11的实现(部分),你应该使用std :: thread和std :: mutex。否则,你应该使用boost :: thread。如果您无法访问,请在linux下使用pthread。
答案 2 :(得分:0)
在Linux上,您需要使用pthreads
答案 3 :(得分:0)
由于两个线程都在读取/写入I / O(读取目录和写入日志文件),因此不需要多线程:由于每个I / O访问都在较低的位置排队,因此无法提高并行任务的速度水平。
答案 4 :(得分:0)
这个C语言代码可能会给你一些提示。回答你的问题: 您应该在pthread中使用互斥锁,以确保日志文件只能由一个线程同时访问。
#include <pthread.h>
#include <stdio.h>
pthread_mutex_t LogLock = PTHREAD_MUTEX_INITIALIZER;
char* LogFileName= "test.log";
void* func_tid0( void* a) {
int i;
for(i=0; i < 50; i++ ) {
pthread_mutex_lock(&LogLock);
fprintf((FILE*)a, "write to log by thread0:%d\n", i);
pthread_mutex_unlock(&LogLock);
}
}
void* func_tid1(void* a) {
int i;
for(i=0; i < 50; i++ ) {
pthread_mutex_lock(&LogLock);
fprintf((FILE*)a, "write to log by thread1:%d\n", i);
pthread_mutex_unlock(&LogLock);
}
}
int main() {
pthread_t tid0, tid1;
FILE* fp=fopen(LogFileName, "wb+");
pthread_create(&tid0, NULL, func_tid0, (void*) fp );
pthread_create(&tid1, NULL, func_tid1, (void*) fp );
void* ret;
pthread_join(tid0, &ret);
pthread_join(tid1, &ret);
}
答案 5 :(得分:0)
你的另一个问题不存在。 因为主线程暂停在你的第一个pthread_join,但这并不意味着第二个线程不会运行。实际上第二个线程是从pthread_create(thread1)开始的。
实际上pthread_mutex会使您的程序串行化。