0

在我的项目中,我想创建一个线程,它什么都不做,只是将一些字符串附加到文本文件以测试它是否有效。我在 Ubuntu 12.04 上使用 IDE Eclipse Juno。我的部分代码是:

pthread_t processThread;
threadData * thData = new threadData;
int t = pthread_create(&processThread, NULL, 
                       BufferedData::processData, (void *)thData);

其中 threadData 是带有线程参数的结构。BufferedData 类的线程启动成员函数,因此 processData 方法是静态的。它的声明是:

static void * processData(void * arg);

在这部分代码之后,我检查了 t 值 - pthread_create 的返回值。每次它都等于 0,所以我认为线程的启动是成功的。但它仍然什么都不做 - 它不会将字符串附加到文件中。函数 processData 做什么并不重要:将字符串附加到文件,抛出异常,写入 cout 或其他东西。它每次都什么都不做。

我不是经验丰富的 C++ 程序员,所以我不知道要检查、编辑或做什么来解决问题。IDE没有给我任何错误的回应,它面对一切都很好。

感谢您的回答。

编辑:processData 函数的代码:

void * BufferedData::processData(void * arg) {
HelperFunctions h;
h.appendToFile("log", "test");
    return 0;
}

appendToFile 方法将字符串“test”写入文件“log”。这在其他项目中经过测试并且有效。

4

1 回答 1

0

现在你的线程将在一段时间内完成(不是无限的),所以这可以帮助你:

int pthread_join(pthread_t thread, void **status);

在下面code,当您的线程创建时,pthread_join函数等待您的线程返回。在这种状态下使用pthread_exit()代替return关键字。

试试这个pthread_join()

void *ret;
pthread_t processThread;
threadData * thData = new threadData;
int t = pthread_create(&processThread, NULL, 
                       BufferedData::processData, (void *)thData);

if (pthread_join(processThread, &ret) != 0) {
    perror("pthread_create() error");
    exit(3);
  }

   delete ret;      // dont forget to delete ret (avoiding of memory leak)

并使用pthread_exit()

void * BufferedData::processData(void * arg) {
int *r = new int(10);
HelperFunctions h;
h.appendToFile("log", "test");
    pthread_exit(static_cast<void*>(a));
}

一般说明

允许调用thread等待目标的结束thread

pthread_t是用于唯一标识线程的数据类型。它pthread_create()由应用程序在需要线程标识符的函数调用中返回和使用。

status 包含一个指针,指向由结束线程传递的状态参数作为pthread_exit(). 如果结束线程以返回终止,则 status 包含指向该return值的指针。如果线程被取消,状态可以设置为-1

返回值

如果成功,则pthread_join()返回0。如果不成功,则pthread_join()返回-1并设置errno为以下值之一:

错误Code

Description :

EDEADLK
    A deadlock has been detected. This can occur if the target is directly or indirectly joined to the current thread.
EINVAL
    The value specified by thread is not valid.
ESRCH
    The value specified by thread does not refer to an undetached thread.

笔记:

返回成功时pthread_join(),目标线程已被分离。多个线程不能pthread_join()用来等待同一个目标线程结束。如果一个pthread_join()线程在另一个线程成功地pthread_join()为同一个目标线程发出之后再发出一个目标线程,那么第二个线程pthread_join()将不成功。

如果线程调用pthread_join()被取消,目标线程不会被分离

于 2018-07-03T02:57:27.030 回答