小编Pav*_*ath的帖子

在bash中的并行进程之间添加等待

我有一个bash脚本可将数据上传到站点。我的上传速度越来越慢,因此我开始使用xargs和-N1并行运行它,同时运行5个。

但是,问题是服务器是否要求我解决一次验证码,如果我一次运行5次,而一次运行1次则可以正常工作。

我认为这是因为所有进程都完全在同一时间启动,因此我被标记了。

无论如何,这就是问题所在,我有什么办法可以在xargs / gnu并行启动过程之间添加等待时间(例如1秒)吗?

我唯一想出的就是使用pgrep脚本| wc -1来计算脚本实例,并休眠该秒数。

但是,这实际上不是最佳选择,是否有更好的方法呢?

linux parallel-processing bash shell xargs

5
推荐指数
1
解决办法
3041
查看次数

什么决定整数的大小?

sizeof(int)Dev Cpp虽然它在64位机器上运行,但在我身上显示4 .为什么不考虑底层硬件并显示8呢?另外,如果我编译环境也改为64位(首先是否64 bit compiler有意义?!),那么int的大小会改变吗?

是否有任何标准来决定这一点?

c compiler-construction 64-bit sizeof

5
推荐指数
1
解决办法
6743
查看次数

如何从RAM获取数据?

在C中,每个字节都是可单独寻址的.假设一个整数(比如使用4个字节)有一个地址0xaddr(32位,假设我们有32位处理器,32位地址总线和32位数据总线),并假设整数的值为0x12345678.现在,如果我从内存中获取此值,处理器如何执行此操作?处理器是否在0xaddr地址线上放置(32位地址),然后获取8位数据0x12.然后处理器将0xaddr+1在地址线上加速,然后获取另一个8位数据0x34,依此类推整数的4个字节?或者处理器是否只是一次放置0xaddr并读取4个字节,从而利用其完整的32位数据总线?

c memory ram x86

5
推荐指数
1
解决办法
2204
查看次数

什么是签名的char指针和未签名的char指针之间的工作差异?

我能理解一个signed char和一个之间的区别unsigned.但是,相应类型的指针在其操作中是否相同?Cos sizeof(char)sizeof(unsigned char)总是一样的(或者有任何反例?)

对于指针,只有数据类型的大小才重要.如果我使用char *unsigned char *互换,是否有任何陷阱?

我觉得这些帖子很有用:(

unsigned char和char指针之间的区别

为什么短*而不是char*为字符串?char*和unsigned char*之间的区别?

c unsigned pointers sizeof char

5
推荐指数
1
解决办法
2300
查看次数

如何使用GNU hcreate_r

#include <stdio.h>
#include <stdlib.h>
#include <search.h>
#include <assert.h>

char *data[] = { "alpha", "bravo", "charlie", "delta",
      "echo", "foxtrot", "golf", "hotel", "india", "juliet",
      "kilo", "lima", "mike", "november", "oscar", "papa",
      "quebec", "romeo", "sierra", "tango", "uniform",
      "victor", "whisky", "x-ray", "yankee", "zulu"
       };

int
main(void)
{
    ENTRY e, **ep;
    struct hsearch_data *htab;
    int i;
    int resultOfHcreate_r;
    resultOfHcreate_r=hcreate_r(30,htab);
    assert(resultOfHcreate_r!=0);
    hdestroy_r(htab);
    exit(EXIT_SUCCESS);
}
Run Code Online (Sandbox Code Playgroud)

错误 hcreate_r

怎么用hcreate_r

还有一个问题是:

您能否使用GNU扩展C库示例?我认为GNU扩展C库的文档写的知识不够.

我有很多关于如何使用扩展C库的问题.

c gnu

5
推荐指数
1
解决办法
2944
查看次数

与睡眠相比,定时器具有更好的精度()

很久以前我的程序中有一个错误.根本原因是C函数

sleep(60);
Run Code Online (Sandbox Code Playgroud)

在极少数情况下会睡不到60秒.或者该函数确实导致线程睡眠时间超过60秒,但是操作系统自动更改了时钟(这似乎很可能只是因为错误发生在上面XX::00::00),也就是它很少表现出来,而且只在"圆形小时"(睡眠shoudl已经结束> xh0m0s,结束了x-1h59m59.99*s).
然后我的项目经理咆哮他怎么说了几百万次我们应该只使用计时器,而不是睡觉.从那时起,我接受了定时器比睡眠更准确的概念(),但现在我觉得我应该要求一些更权威的来源.所以:

  1. 定时器比睡眠更准确吗?
  2. (相关)他们是在内部深处(在操作系统级别上)使用不同的方法实现的吗?
    我知道定时器用来做回调,睡眠只是延迟当前线程的执行,我在谈论延迟执行部分的实现.

BTW OS是Linux,但如果可能的话我会关心一般的答案.

c c++ sleep timer

5
推荐指数
1
解决办法
2486
查看次数

.bashrc语法错误:意外的文件结束

我收到意外的文件错误结束.我不确定如何解决它.

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# User specific aliases and functions

export PS1='\[\e[0;32m\]\u\[\e[m\] \[\e[1;34m\]\w\[\e[m\] \[\e[1;32m\]\$\[\e[m\] \[\e[1;37m\]'

export LS_COLORS='di=35;1'


alias la='ls -lah'
alias cdu='cd /home/hzhang/primary'

#module load gnu-compilers/4.7.0
#module load mvapich3/gnu/1.7

.ls /opt/intel/Compiler/11.1/072/bin/ifortvars.sh intel64

#PATH=$PATH:/home/hzhang/primary/over2.2e/bin_dp:/home/hzhang/primary/foiltest
PATH=$PATH:/opt/overflow/intel/serial/bin_dp/:/home/hzhang/primary/chimera2.1/bin_dp/:/u/primary/hzhang/pegasus/bin_dp
export PATH

ulimit -s unlimited 
Run Code Online (Sandbox Code Playgroud)

linux bash

5
推荐指数
4
解决办法
2万
查看次数

位域附近的变量会损坏吗?

我面临的问题与Linux内核社区所描述的问题非常相似- 由位域背叛

问题的实质在于,GCC发出64位读取访问以访问偶数1位位域。这会导致读取相邻字段的意外副作用,而该副作用可在程序的其他位置进行修改。当回写修改后的位域值时,相邻变量的旧值也会被回写,从而丢失其他线程对其所做的任何修改。

我的问题略有不同。我有这样的课程/结构-

class Group {

    uint8 adjVariable;
    volatile bool  flag1: 1;
    volatile bool  flag2: 1;
    // so on...
    volatile bool  flag10: 1;
};
Run Code Online (Sandbox Code Playgroud)

访问这些变量的方式是-

Group::fun() {
    Group_Scoped_lock();
    // adjVariable was 12 here.
    if ( adjVariable > 0 ) {
        adjVariable = 0; // <------- EXPLICIT ZERO ASSIGNMENT
    }
    // some code that doesn't affect adjVariable 
    bool1 = false;
    bool2 = false;
    bool3 = false;
    assert( adjVariable == 0 ); // <---- This assert is tripping stating that adjVariable …
Run Code Online (Sandbox Code Playgroud)

c++ linux multithreading gcc

5
推荐指数
1
解决办法
155
查看次数

唤醒单个线程而不是在 pthreads 中忙等待

我不确定标题是否反映了我在这里问的内容,但如果没有很长的标题,我能做到的最好。我正在尝试worker threadpthreads. 我想从main函数中生成一组线程,然后main线程将作业委托给工作线程并等待所有线程完成,然后再为它们分配下一个作业(实际上,要求是将线程安排在一个块中,很像 CUDA编程模型,但在 CPU 上。虽然它与当前问题无关)。该job数组用于向每个线程指示作业类型。目前,我已经使用信号量实现了这一点,这会强制执行繁忙的等待。我正在寻找方法使线程仅在需要时才进入睡眠和唤醒状态,而不是连续轮询。

每个线程执行的函数

volatile int jobs[MAX_THREADS]; // global job indicator array
sem_t semaphore;                // semaphore to indicate completion
thread_execute(void *args)
{
  tid = get_id(args);
  while(jobs[tid] != -1)
  {
    if(jobs[tid] == 0) continue; // no job
    if(jobs[tid] == JOBS_1)
    {
      jobs1();
      jobs[tid] = 0; // go back to idle state
      sem_post(&semapahore);
    }
    if(jobs[tid] == JOBS_2)
    {
      jobs2();
      jobs[tid] = 0; // go back to idle state
      sem_post(&semapahore); …
Run Code Online (Sandbox Code Playgroud)

c multithreading semaphore pthreads

4
推荐指数
1
解决办法
7650
查看次数

Linux系统调用

我能够执行系统调用调用并在内核中进行处理.但很少有事情我不清楚.进入swi例程后,内核将用户模式寄存器保存在堆栈中.问题是-

  1. 是谁的堆栈?(因为swi处理和相应的系统调用例程需要堆栈框架才能工作)

  2. 如果它是Kernel自己的堆栈,从哪里获得堆栈分配..?它会开始使用当前的堆栈吗?如果是,则current可以是内核中当时可能正在执行的任何进程.这不是耗尽电流的堆栈吗?

  3. 如果它在swi处理程序中使用当前正在执行的User进程的堆栈,那么这将是内核现在将访问的用户地址空间.这可能吗?由于内核可寻址内存在1GB以内(如果在4GB RAM内存系统中使用1:3内核到用户地址空间比率).

arm linux-kernel embedded-linux

4
推荐指数
1
解决办法
1281
查看次数