我想使用 pthread 通过将表达式分解为线程来解决它。
我的问题是:- 如果要使用 pthreads 评估像 (a+b)+(c+d)+(e+f) 这样的表达式:-
- 创建 3 个线程,其中第一个表达式 (a+b) 由第一个线程求值,(c+d) 由第二个线程求值,(e+f) 由第三个线程求值。
- 上述所有变量的值都是'1',因此,表达式评估的最终答案应该是'6'。
- 最后应该执行第三个线程,它将最终输出打印为“6”。
那怎么办呢??
解析表达式时,您将获得如下所示的抽象语法树:
+
/ \
+ +
/ \ / \
+ + e f
/ \ |\
a b c d
您可以在语法树的节点处将问题划分为线程。在评估一个节点时,您可以将两个不同的子问题(左子树和右子树)分配给两个不同的线程。每个子线程都可以重复该模式,直到您充分并行化了树。在代码中,这可能如下所示:
int evaluate_subtree_threaded(node_t* parent_node)
{
int left_result, right_result;
pthread_t thread;
pthread_create(&thread, NULL, evaluate_subtree_threaded, parent_node->left);
right_result = evaluate_subtree(parent_node->right);
pthread_join(thread, &left_result);
return left_result + right_result;
}
请注意此代码片段如何公然假设实际的评估逻辑在evaluate_subtree
其中并忽略所有类型。
当然,请注意创建线程比评估表达式要昂贵得多。