我正在研究一种工具,让学生自我评估他们的编程作业的表现.特别是,他们编写的程序是多线程的,我没有直接的方法来影响创建的线程数.我想在给定不同数量的内核的情况下比较其程序的性能(理想情况下,它们的程序应该大致成比例地加速它允许使用的内核数量).
我们可以将一个位掩码传递给Process.SetAffinity来控制程序使用的核心.
这在使用超线程并将每个物理核心分成两个逻辑核心的i5和i7机器上存在问题.我希望程序在两个/四个不同的物理内核上运行.在我的i7机器上,亲和力设置为3(核心0和1)的进程将大致与单个核心上的程序一样快(表示这些逻辑核心共享相同的物理核心),但亲和力设置为5(核心0和3)它运行得更快(表明这些内核使用不同的物理内核).但是,我没有找到一种可靠的方法(除了反复试验)来确定这一点.
我如何(没有实验)确定哪些逻辑核共享相同的物理核心?
(/ proc/cpuinfo具有我需要的信息,但在Windows机器上不可用.)
我正在用C编写一个简单的网络服务器,用于我正在做的课程.一个要求是我们实现一个线程池来处理使用pthreads的连接.
我知道我将如何大致这样做(在主线程中调用accept并将文件描述符传递给freee线程),但是我的朋友提出了一种替代方法,而不是我想到的方法:在前面创建我的所有线程,并让他们全部循环接听电话.接受的想法是阻止所有空闲线程,当连接进入时,只给出一个文件描述符.然后当一个给定的线程完成一个连接时,它会循环回来并阻塞一个调用再次接受.使用accept()作为信号量的调用.这样可以简化其实现的实现,因为您不需要跟踪哪些线程正忙,哪些线程已准备好进行连接.理论上它也可能是较低的延迟,因为线程可以立即开始执行.
我的问题是,这样安全吗?我打算实施它并尝试一下,但我还没准备好,我很想知道答案.我在谷歌和这里搜索stackoverflow,但找不到任何人这样做.接受线程安全吗?我假设这种方法会有更多的开销,因为你一直在运行所有的线程,这两种方法只是简单的内存/延迟权衡吗?
编辑:我不确定这应该是社区维基,如果它应该是道歉,我找不到按钮:P
我有一个ProgressBarWindow,它有一个进度条和一个取消按钮,我用它来报告文件I/O的进度.但是,尽管在后台工作中完成了所有工作,但ProgressBarWindow的UI线程和我的主窗口都会挂起.进度条呈现,就像我的主窗口一样,但是在后台工作人员执行其操作时不会更新.在主窗口的构造函数的最后调用以下代码:
iCountLogLinesProgressBar = new ProgressBarWindow();
iCountLogLinesProgressBar.cancelButton.Click += EventCountLogLinesProgressBarCancelButtonClicked;
iCountLogLinesProgressBar.Show();
iCountLogRecords = new BackgroundWorker();
iCountLogRecords.DoWork += EventCountLogLinesDoWork;
iCountLogRecords.ProgressChanged += EventCountLogLinesProgressChanged;
iCountLogRecords.RunWorkerCompleted += EventCountLogLinesRunWorkerCompleted;
iCountLogRecords.WorkerReportsProgress = true;
iCountLogRecords.WorkerSupportsCancellation = true;
iCountLogRecords.RunWorkerAsync(new BinaryReader(File.Open(iMainLogFilename, FileMode.Open, FileAccess.Read)));
Run Code Online (Sandbox Code Playgroud)
EventCountLogLinesProgressChanged()看起来像这样:
private void EventCountLogLinesProgressChanged(object sender, ProgressChangedEventArgs e)
{
iCountLogLinesProgressBar.Value = e.ProgressPercentage;
}
Run Code Online (Sandbox Code Playgroud)
这是ProgressBarWindow的缩短版本(其余只是几个setter):
public partial class ProgressBarWindow : Window
{
public ProgressBarWindow()
{
InitializeComponent();
this.progressBar.Value = this.progressBar.Minimum = 0;
this.progressBar.Maximum = 100;
}
public double Value
{
get
{
return progressBar.Value;
}
set
{
this.progressBar.Value = value;
} …
Run Code Online (Sandbox Code Playgroud) 我正在编写一些代码来使用EntityFrameWork访问数据库.代码是:
public IEnumerable<Rows> GetRows(int id)
{
using (var context = new ApplicationDbContext())
{
var repository = new EntityFrameWorkRepository<int, RowEntity>(context);
//need a ToList() here to prevent disposed dbcontext errors
return repository.GetRowsFromDb(id).ToList();
}
}
Run Code Online (Sandbox Code Playgroud)
GetRowsFromDb()使用LINQ查询数据库并使用id过滤结果.
我最初在没有ToList()调用的情况下编写了上面的方法,但是当我尝试访问返回的IEnumerable中的对象时,我会得到一个关于dbcontext已被处置的异常.我不明白上面的代码如何解决问题,虽然它确实有效.我假设ToList()深度复制对象,这可能提供了与上下文/数据库的必要分离,但是原始对象肯定可以使用吗?
我正在尝试编写一个应用程序,它将开始通过miracast将屏幕从Android手机投射到电视上.我正在使用HDMI加密狗,因为有问题的电视本身并不支持miracast.我一直在尝试这里的代码,但它需要一个我遵循这些步骤的应用程序ID .我的问题是,说明似乎表明我需要注册miracast加密狗,以便它与未发布的'debug'应用程序进行通信.但是,仅提及Google Cast设备,这与miracast的协议不同.我还需要注册加密狗吗?
有没有更简单的方式通过miracast以编程方式投射到设备?要求是没有用户交互,所以我不能只显示一个强制转换按钮.
我正在使用Android 5.1,如果这是相关的.
编辑:经过进一步的研究,我意识到Google Cast使用了与Miracast完全不同的协议,因此所有关于注册加密狗的讨论都是无关紧要的.Android中的Miracast根本不需要注册.问题是隐藏了API,请参阅下面的答案以获取详细信息.
我正在努力强化我正在进行的项目中的一些可执行文件.为了测试,我正在使用一个hello world程序,并使用checksec检查它,它报告没有金丝雀.我对Rust很陌生,谷歌缺乏信息让我觉得我错过了一些明显的东西.
使用GCC,它是一个简单的编译器标志:-fstack-protector-all
.我发现的最接近LLVM的是安全堆栈.但是,当我尝试将其传递给LLVM时,Rust编译器似乎没有认识到这一点.例如:
rustc -C llvm-args="-fsanitize=safe-stack" -C link-arg="-fsanitize=safe-stack" test.rust
Run Code Online (Sandbox Code Playgroud)
结果是
rustc:未知的命令行参数'-fsanitize = safe-stack'.试试:'rustc -help'sugcc:你的意思是'-spp-no-call'?
我正在使用Rust 1.23.0.我试图不仅在x86_64上添加这些金丝雀,而且在armeabi-v7a上添加这些金丝雀,以防相关.
我有一个Kinesis生产者,它将一种类型的消息写入流.我想在多个完全不同的消费者应用程序中处理此流.因此,pub/sub具有针对给定主题/流的单个发布者.我还想利用检查点来确保每个使用者处理写入流的每条消息.
最初,我为所有消费者和生产者使用相同的App Name.但是,一旦我启动了多个消费者,我就开始收到以下错误:
com.amazonaws.services.kinesis.model.InvalidArgumentException:在Shard上的GetShardIterator中使用的StartingSequenceNumber 49564236296344566565977952725717230439257668853369405442在流中的PackageDreated中的shard shardId-000000000000************无效,因为它不是来自此流.(服务:AmazonKinesis;状态代码:400;错误代码:InvalidArgumentException;请求ID:..)
这似乎是因为消费者正在使用相同的应用名称与他们的检查点发生冲突.
通过阅读文档,似乎使用检查点进行发布/订阅的唯一方法是为每个消费者应用程序创建一个流,这需要每个生产者了解所有可能的消费者.这比我想要的更紧密耦合; 它真的只是一个队列.
似乎Kafka支持我想要的东西:任意消费给定的主题/分区,因为消费者完全控制自己的检查点.如果我想要使用检查点的pub/sub,我是唯一选择转移到Kafka或其他替代方案的选择吗?
我的RecordProcessor代码,在每个消费者中都是相同的:
override def processRecords(processRecordsInput: ProcessRecordsInput): Unit = {
log.trace("Received record(s) from kinesis")
for {
record <- processRecordsInput.getRecords
json <- jawn.parseByteBuffer(record.getData).toOption
msg <- decode[T](json.toString).toOption
} yield subscriber ! msg
processRecordsInput.getCheckpointer.checkpoint()
}
Run Code Online (Sandbox Code Playgroud)
代码解析消息并将其发送给订户.现在,我只是将所有消息标记为已成功接收.我可以看到在AWS Kinesis仪表板上发送的消息,但没有发生读取,可能是因为每个应用程序都有自己的AppName,并且没有看到任何其他消息.
我有以下方法:
override def insertAll(notifications: Seq[PushNotificationEncoded])
(implicit ec: ExecutionContext): Future[Unit] = {
val f = Future.sequence(notifications.map(insert)).map(_ => Unit)
f.onFailure { case ex => sys.error(s"Got exception whilst saving PushNotification: $ex") }
f
}
Run Code Online (Sandbox Code Playgroud)
它给出了以下编译器错误:
type mismatch;
found : scala.concurrent.Future[Unit.type]
required: scala.concurrent.Future[Unit]
f
^
Run Code Online (Sandbox Code Playgroud)
我认为Unit是一个带有单个元素的类型,因此在Unit中不应该有任何混淆.我尝试使用Google搜索,但我找不到有关"Unit.type"的更多信息.
如果我简化这样的方法,那么它工作正常:
override def insertAll(notifications: Seq[PushNotificationEncoded])
(implicit ec: ExecutionContext): Future[Unit] =
Future.sequence(notifications.map(insert)).map(_ => Unit)
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?
我正在整理一个端口扫描仪作为学习练习.我的问题是我正在尝试在TCP标头中设置最大段大小选项(MSS).我看了一下tcp.h,但是我无法弄清楚如何设置它.我希望会有这样的选项:
tcp_header->mss(32000);
与上面类似的东西在tcp.h中,但在右边的struct中没有.不可否认,我仍然是读取结构定义的新手,我对tcp.h没有多大意义,所以最后我尝试在TCP头的末尾添加必要的字节:
struct tcphdr *CreateTcpHeader()
{
struct tcphdr *tcp_header;
tcp_header = (struct tcphdr *)malloc(sizeof(struct tcphdr)+4*sizeof(int));
tcp_header->source = htons(SRC_PORT);
tcp_header->dest = htons(DST_PORT);
tcp_header->seq = htonl(0);
tcp_header->ack_seq = htonl(0);
tcp_header->res1 = 0;
tcp_header->doff = (sizeof(struct tcphdr))/4;
tcp_header->syn = 1;
tcp_header->window = htons(4096);
tcp_header->check = 0; /* Will calculate the checksum with pseudo-header later */
tcp_header->urg_ptr = 0;
/*memcpy the mss data onto the end of the tcp header. */
int mssCode = 2;
int mssLength = 4;
uint16_t mss = htonl(32000); …
Run Code Online (Sandbox Code Playgroud) 我有一个简单的swing应用程序,它包含一个JLabel和三个按钮.这三个按钮位于自己的JPanel中,它与JLabel一起位于JFrame中.JPanel使用flowlayout管理器水平排列按钮,JFrame使用BorderLayout管理器垂直排列JLabel和JPanel.
我的问题是当我启动应用程序时,在使用过程中,其中一个按钮上的文本发生变化,这会增加其宽度.但是,窗口没有调整大小以适应这个并且其中一个按钮消失.我想再次调用pack(),但JFrame是我的构造函数中的局部变量,同样,我不应该告诉我的程序调整大小,对吧?我一直无法在谷歌或这里找到任何帮助我,但必须有一个简单的解决方案,我错过了什么?代码如下.
playButton = new JButton("Play");
pauseButton = new JButton("Pause");
stopButton = new JButton("Stop");
curTrackLabel = new JLabel("No Track Selected");
JFrame myFrame = new JFrame("MediaPlayer");
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myFrame.setTitle("MediaPlayer");
myFrame.setLocation(400,300);
JPanel topPanel = new JPanel();
topPanel.setLayout(new BorderLayout());
myFrame.add(topPanel);
JPanel buttonPanel = new JPanel(new FlowLayout());
buttonPanel.add(playButton);
buttonPanel.add(pauseButton);
buttonPanel.add(stopButton);
topPanel.add(buttonPanel, BorderLayout.CENTER);
topPanel.add(curTrackLabel, BorderLayout.NORTH);
playButton.addActionListener(new playButtonHandler());
pauseButton.addActionListener(new pauseButtonHandler());
stopButton.addActionListener(new stopButtonHandler());
myFrame.pack();
myFrame.setVisible(true);
Run Code Online (Sandbox Code Playgroud) 我用浮动遇到了一些奇怪的舍入行为.下面的代码演示了这个问题.解决这个问题的最佳方法是什么?我一直在寻找解决方案,但没有太多运气.
#include<stdio.h>
int main(void)
{
float t;
t = 5592411;
printf("%f\n", 1.5*t);
t *= 1.5;
printf("%f\n", t);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码应打印出相同的值,但我在使用GCC 4.7.2进行设置时得到了这个值:
8388616.500000
8388616.000000
如果我使用计算器,我得到第一个值,所以我假设第二个值是以某种方式舍入.我有相同的Fortran代码,它不会对值进行舍入(具有0.5).
c ×3
c# ×3
android ×2
java ×2
sockets ×2
.net ×1
affinity ×1
android-wifi ×1
casting ×1
google-cast ×1
jframe ×1
jpanel ×1
linq ×1
linux ×1
llvm ×1
miracast ×1
processor ×1
progress-bar ×1
pthreads ×1
rust ×1
scala ×1
struct ×1
swing ×1
tcp ×1
threadpool ×1
types ×1
ui-thread ×1
wifi-direct ×1
wpf ×1