.NET 4中的Parallel类并行处理详解

需积分: 14 44 下载量 58 浏览量 更新于2024-08-05 收藏 97.07MB PDF 举报
"C#高级编程·(第7版) - Christian Nagel, Jeffery Richter, Jay Glynn, Tao Li 著" 在.NET Framework 4中,C#引入了一个新的抽象线程处理类——`Parallel`类,这极大地简化了多线程并行计算的实现。`Parallel`类主要提供了`For`和`ForEach`两个静态方法,用于并行执行循环操作,以及`Parallel.Invoke`方法,用于同时调用多个不同的方法。 `Parallel.For`方法类似于传统的C# `for`循环,但其可以在多个线程上并行执行。这个方法接受三个参数:循环的起始值、结束值和一个迭代委托。在给定的范围内,`Parallel.For`会自动拆分任务并在可用的线程池中分配工作,从而提高执行效率。需要注意的是,由于并行执行,迭代的顺序是不确定的,并且在循环内部的操作可能会交错。 例如,在提供的代码段中,`Parallel.For`方法用于打印循环索引、任务ID和线程ID。每次迭代时,控制台将输出相关信息。从输出可以看出,循环并不按照预期的顺序进行,而是由系统根据线程调度来决定。在这个例子中,可以看到三个任务(task)在三个不同的线程(thread)上执行。 `Parallel.For`还支持一个可选的参数,类型为`ParallelOptions`,它可以用来定制循环行为。例如,你可以通过这个参数定义一个方法来响应`ParallelLoopState`对象的`Break`或`Stop`方法,这样可以在运行过程中提前终止循环。 `Parallel.ForEach`方法类似,但它适用于遍历集合。与`For`一样,`ForEach`也能并行处理集合中的元素,提供了一个高效的方式来进行集合的并行操作。 `Parallel.Invoke`方法则允许你同时执行一组方法,这些方法会在各自的线程上并行运行,提高了程序的并发性。 `Parallel`类的引入极大地简化了C#程序员进行多线程并行编程的过程,通过利用多核处理器的能力,能够显著提升计算密集型任务的执行速度。开发者只需关注任务本身,无需过多关注底层的线程管理细节,这使得并行编程变得更加易用和高效。在实际应用中,正确地使用`Parallel`类可以有效优化性能,特别是在大数据处理和计算密集型应用中。

create_power_domain PD_TOP create_power_domain PD1 -elements {Block1} -scope Block1 create_power_domain PD2 -elements {Block2} -scope Block2 create_power_domain PD3 -elements {Block3} -scope Block3 create_power_domain PD_TOP create_power_domain PD1 -elements {Block1} -scope Block1 create_power_domain PD2 -elements {Block2 Block3} create_power_domain PD_TOP set_scope Block1 create_power_domain PD1 set_scope ... create_power_domain PD2 -elements {Block2 Block3} create_power_domain domain_name [-elements list] [-supply {supply_set_handle supply_set_name}] [-include_scope] create_supply_port port_name create_supply_net net_name [-domain domain_name] [-reuse] [-resolve unresolved | parallel | one_hot | parallel_one_hot | user_defined_resolution_function] connect_supply_net supply_net_name -ports list create_supply_port VDD1P -domain Block1/PD1 create_supply_net VDD1 -domain Block1/PD1 connect_supply_net Block1/VDD1 -ports Block1/VDD1P connect_supply_net VDD1 -ports Block1/VDD1P set_domain_supply_net domain_name -primary_power_net supply_net_name -primary_ground_net supply_net_name set_domain_supply_net Block1/PD1 -primary_power_net Block1/VDD1 -primary_ground_net Block1/GND create_power_switch switch_name -domain domain_name -output_supply_port {port_name supply_net_name} {-input_supply_port {port_name supply_net_name}}* {-control_port {port_name net_name}}* {-on_state {state_name input_supply_port {boolean_function}}}* [-ack_port {port_name net_name [{boolean_function}]}]* [-ack_delay {port_name delay}]* [-off_state {state_name {boolean_function}}]* [-on_partial_state {state_name {boolean_function}}]* [-error_state {state_name {boolean_function}}]* map_power_switch switch_name -domain domain_name -lib_cells list create_supply_set supply_set_name associate_supply_set supply_set_name -handle supply_set_name set_equivalent -nets supply_nets | -sets supply_sets prompt> set_equivalent -nets {VDDa VDDb VDDc} # equivalent supply nets prompt> set_equivalent -sets {SS1a SS1b} # equivalent supply sets 什么意思

2023-07-22 上传

#!/bin/bash CPWD=$(cd $(dirname $0);pwd) cd $CPWD rm -f ssd_symbol_set hdd_symbol_set nvme_symbol_set filter_ssd_hdd_nvme_set() { rm -f ssd_symbol_set hdd_symbol_set nvme_symbol_set os_disk_symbol=$(echo $(lsblk |grep -B1 -E "part|boot" |grep -E "^sd[a-z]+|^nvme" |awk '{print $1}') |sed 's/ /|/') non_os_disk_set=$(lsscsi -g |-E "ATA|TOSHIBA" |awk '{print $(NF-1)}' |grep -Ev $os_disk_symbol) if [[ -n $non_os_disk_set ]];then for i in $(echo "$non_os_disk_set") do rotationRate=$(smartctl -i $i |awk -F":" '/Rotation Rate/{print $2}') if [[ $rotationRate =~ "Solid State Device" ]];then echo $i |awk -F"/" '{print $3}' >> ssd_symbol_set elif [[ $rotationRate =~ "rpm" ]];then echo $i |awk -F"/" '{print $3}' >> hdd_symbol_set fi done fi nvme_info_set=$(nvme list |grep -E "nvme[0-9]+n1") if [[ -n $nvme_info_set ]];then echo "$nvme_info_set" |awk '{print $1}' |awk -F"/" '{print $3}' > nvme_symbol_set fi } hdd_parallel_fio_test() { # multi hdd fio test if [ -s hdd_symbol_set ];then for dev in $(cat hdd_symbol_set) do nohup &>/dev/null bash hdd_raw_fio_test.sh $dev & done wait mkdir -p $CPWD/hdd_fio_log mv hdd_sd*_*.log $CPWD/hdd_fio_log fi } ssd_parallel_fio_test() { # multi sata ssd fio test if [ -s ssd_symbol_set ];then for dev in $(cat ssd_symbol_set) do nohup &>/dev/null bash ssd_raw_fio_test.sh $dev & done wait mkdir -p $CPWD/ssd_fio_log mv ssd_sd*_*.log $CPWD/ssd_fio_log fi } nvme_parallel_fio_test() { # multi nvme ssd fio test if [ -s nvme_symbol_set ];then for dev in $(cat nvme_symbol_set) do nohup &>/dev/null bash ssd_raw_fio_test.sh $dev & done wait mkdir -p $CPWD/nvme_fio_log mv ssd_nvme*_*.log $CPWD/nvme_fio_log fi } filter_ssd_hdd_nvme_set #hdd_parallel_fio_test #ssd_parallel_fio_test nvme_parallel_fio_test

2023-06-07 上传