在C ++中进行线程化以保持两个函数并行运行

时间:2013-03-11 13:12:27

标签: c++ linux multithreading

我有一个代码,包含两个函数func1和func2。这两个功能的作用是一样的。继续不断读取目录并写入各自日志文件中存在的文件名。这两个函数都引用了一个常用的日志函数来写日志。我想在我的代码中使用引入线程,这样它们都可以并行运行但两者都不应该同时访问日志功能。如何实现?

6 个答案:

答案 0 :(得分:2)

这是需要互斥锁的经典案例。

void WriteToLog(const char *msg)
{
   acquire(mutex);
   logfile << msg << endl;
   release(mutex);
}

上述代码不会“复制并粘贴”到您的系统中,因为互斥锁是系统特定的 - 如果您使用pthread_mutexpthreads将是您的选择。 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会使您的程序串行化。