我对C ++很陌生,我现在正在尝试使用线程。 我试图在while循环中的线程内创建一个线程。但我认为它似乎没有用。 目前我的代码看起来像这样:
#include <>
std::vector<pthread_t> outer_thread, inner_thread;
void *inner_thread(void *ptr)
{
string data1;
data1 = *(reinterpret_cast<string*>(ptr));
cout << "inner thread started " << data1;
/* do something */
cout << "inner thread stopped " << data1;
pthread_exit(NULL);
return 0;
}
void *outer_thread(void *ptr )
{
cout << "out thread started" << endl;
//cout << ptr << endl;
//cout << *(reinterpret_cast<string*>(ptr)) << endl;
string data;
data = *(reinterpret_cast<string*>(ptr));
string str3;
while (getline(data,str3))
{
cout << "out thread started" << endl;
pthread_t in_thread;
in_vec.push_back(str3);
int create_thread2 = pthread_create(&in_thread, NULL, &inner_thread, reinterpret_cast<void*>(&(in_vec.at(j))));
inner_thread.push_back(in_thread);
if (create_thread2 != 0)
cout << "Error : Thread";
j++;
cout << "out thread ends " << j << create_thread2 << endl ;
}
for (int k = 0; k < j ; k++)
{
pthread_join(inner_thread.at(k),NULL) ;
}
pthread_exit(NULL);
return 0;
}
int main (int argc, char *argv[])
{
int i = 0;
while (getline(gin,str))
{
string str1;
pthread_t out_thread;
cout << "str1" << str1 << endl;
now_vec.push_back(str1);
int create_thread = pthread_create(&out_thread, NULL, &outer_thread, reinterpret_cast<void*>(&(now_vec.at(i))));
outer_thread.push_back(out_thread);
if (create_thread != 0) cout << "Error : Thread" ;
i++;
}
for (int k = 0 ; k < i; k ++)
{
cout << i << endl;
//cout << "third thread " << outer_thread.at(1) << endl;
cout << outer_thread.at(k) << endl;
cout << "out out out" << endl;
pthread_join(outer_thread.at(k),NULL) ;
}
}
我试图读取包含应该读取的文件列表的文件。我想同时阅读所有这些文件。 所有这些文件都包含信息,需要另一组线程来启动另一个操作。所以这也需要同时完成。 这就是我运行两组线程的原因。 让我知道如果有更快更简单的方法吗?
似乎要等到内部线程完成然后从下一次迭代开始。我希望内部线程在外部线程内同时运行。我可以知道怎么做吗?
答案 0 :(得分:4)
您对线程操作的看法是错误的。线程不在另一个线程内运行。它们是同一进程中的独立执行流,它们的共存是平的,而不是分层的。
使用多个线程时要遵循的一些简单规则:
在您的特定情况下,如果您想通过并行处理多个文件来加速处理多个文件(并假设这些线程需要实现的唯一任务是处理这些文件),那么可能的解决方案看起来像:
工作线程可以循环遍历文件列表,一次读取一个并处理它们。
与您提出的解决方案相比,这个解决方案不会为每个文件创建一个线程。相反,它会创建尽可能多的线程,可以在CPU上并行运行,避免过多的上下文切换。
上述原始示例:
#include <pthread.h>
#include <vector>
#include <string>
#define NUM_THREADS 4
std::vector<std::string> work_pool[NUM_THREADS];
void *worker_thread(void *args);
int main(int argc, char *argv[])
{
pthread_t threads[NUM_THREADS];
// Read list of files here, distribute them evenly amongst the work_pools
for (int i = 0; i < NUM_THREADS; i++) {
pthread_create(&threads[i], NULL, worker_thread, (void *)i);
}
for (int i = 0; i < NUM_THREADS; i++) {
pthread_join(threads[i], NULL);
}
return 0;
}
void *worker_thread(void *args)
{
const int id = (int)args;
std::vector<std::string>::iterator it;
for (it = work_pool[id].begin(); it != work_pool[id].end(); it++) {
// Read file and process it here
}
return NULL;
}
答案 1 :(得分:0)
不确定您要尝试做什么,但在我希望通过简化您的代码来解决的许多语法错误中,会发生以下情况:
请注意,您没有任何并行执行,因为您的线程正在等待其他完成。
请注意,在任务中抛出线程不是加快速度的方法。
线程是一种方式: