小编Pav*_*ath的帖子

唤醒单个线程而不是在 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
查看次数

为什么使用pipe()创建的管道不能用作双向管道?

几乎所有pipe我见过的例子都建议关闭未使用的写/读端.男人也清楚地说明了pipe() creates a pipe, a unidirectional data channel但是我已经尝试在父母和孩子的管道的两端读书和写作,一切似乎都没问题.

所以我怀疑为什么我们需要2个管道,如果两个进程必须相互读写,为什么不使用单个管道呢?

c ipc pipe interprocess

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

捕捉 WM_DEVICECHANGE

如何觉知WM_DEVICECHANGE到达?

WndProc被覆盖了。我收到了一大堆消息,但没有一个是 type WM_DEVICECHANGERegisterDeviceNotification使链接器抱怨它找不到该函数!所以我被困在这个巫毒魔法中。请帮忙。

PS:当然,我一直在谷歌搜索和计算器溢出(笑)所有这些东西大约 8 个小时。

int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
        LPSTR lpCmdLine, int nCmdShow)
{
        LPTSTR lolclassname = "lolclass";
    WNDCLASS lolclass;
    HWND lolwindow;
    MSG lolmsg;
    UINT msgstatus;

    lolclass.style = CS_VREDRAW;
    lolclass.lpfnWndProc = &lol_wnd_proc;
    lolclass.cbClsExtra = 0;
    lolclass.cbWndExtra = 0;
    lolclass.hInstance = hInstance;
    lolclass.hIcon = NULL;
    lolclass.hCursor = NULL;
    lolclass.hbrBackground = (HBRUSH)(COLOR_BACKGROUND + 1);
    lolclass.lpszMenuName = NULL;
    lolclass.lpszClassName = lolclassname;
    if(!RegisterClass(&lolclass)) fail("RegisterClassEx");

    lolwindow = CreateWindow("lolclass", NULL, WS_MINIMIZE, CW_USEDEFAULT,
            CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
            HWND_MESSAGE, …
Run Code Online (Sandbox Code Playgroud)

c windows winapi gcc mingw

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

突出显示VIM中的所有大写单词

在我的.vimrc文件中,我添加了

match Title /EXAMPLE/
Run Code Online (Sandbox Code Playgroud)

因此,当我输入EXAMPLE时,这个单词会突出显示,它工作正常,我的问题是,如何突出显示所有大写字母?不只是示例,还有其他一切.

--> THIS IS AN EXAMPLE
--> SECOND EXAMPLE
--> ETC
Run Code Online (Sandbox Code Playgroud)

我想强调一下像上面的句子.

vim

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

Python自然排序

我有一些文件需要按名称排序,不幸的是我不能使用常规排序,因为我也想对字符串中的数字进行排序,所以我做了一些研究,发现我正在寻找的是什么natural sorting.

我尝试了这里给出的解决方案,它完美地工作.

然而,对于像串PresserInc-1_10.jpgPresserInc-1_11.jpg导致特定的自然密钥算法失败,因为它仅匹配在这种情况下将是第一个整11,所以它抛出了排序.所以我认为可能有帮助的是匹配字符串中的所有数字并将它们组合在一起,所以如果我有PresserInc-1_11.jpg算法应该给我111回来,所以我的问题是,这可能吗?

这是一个文件名列表:

files = ['PresserInc-1.jpg', 'PresserInc-1_10.jpg', 'PresserInc-1_11.jpg', 'PresserInc-10.jpg', 'PresserInc-2.jpg', 'PresserInc-3.jpg', 'PresserInc-4.jpg', 'PresserInc-5.jpg', 'PresserInc-6.jpg', 'PresserInc-11.jpg']

python regex sorting natural-sort

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

printk loglevel在模块编程中的用法

Rubini的LDD3一书中,printk作者说,我们可以为我们的消息提供日志级别/优先级.但我尝试使用一个简单的模块程序,它具有不同的日志级别的printks,但它显示了我在程序中写入printk消息的相同顺序,为什么它不按优先级打印?

我在这里复制了代码

  #include<linux/module.h>
  #include<linux/kernel.h>
  static __init int log_init(void)
     {
         printk(KERN_INFO"inside init 4 \n");
         printk(KERN_ERR"inside init 3\n");
         printk(KERN_CRIT"inside init 2\n");

         return 0;
     }
  static __exit void log_exit(void)
    {
        printk("inside exit\n");
    }
  module_init(log_init);
  module_exit(log_exit);

  MODULE_LICENSE("GPL");
Run Code Online (Sandbox Code Playgroud)

我得到如下输出

[ 1508.721441] inside init 4 
[ 1508.721448] inside init 3
[ 1508.721454] inside init 2
root@jitesh-desktop:~/DD/debug/print#
Run Code Online (Sandbox Code Playgroud)

所以我如何按照优先级打印它

init 2
init 3
init 4
Run Code Online (Sandbox Code Playgroud)

linux linux-device-driver linux-kernel printk

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

malloc可以在两个不同的进程中返回相同的地址吗?

假设我有两个过程a,并b在Linux上.在这两个过程中我malloc()用来分配一个内存,

有没有机会malloc()在两个进程中返回相同的起始地址?如果不是,那么谁来照顾这个.如果是,则两个进程都可以访问此地址的相同数据.

c linux malloc virtual-memory

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

使用正则表达式匹配 C 中的函数和函数调用

我对正则表达式相当陌生,所以我使用正向前瞻编写了以下简单的正则表达式,该正则表达式检测 C 源文件中的函数和函数调用 -

\w+(?=\s*\()
Run Code Online (Sandbox Code Playgroud)

它工作正常,但问题是它也检测非函数语法if()while()如 等。我可以很容易地避免这种情况,说——

(if(?!\()) | (while(?!\())
Run Code Online (Sandbox Code Playgroud)

但问题是如何将第二个正则表达式与第一个正则表达式结合起来?我不能OR他们,因为第一个仍然匹配if()while()等等,并且在一个OR表达式中,如果其中一个术语匹配就足够了。

如何组合这些正则表达式或拥有一个更好、更简单的正则表达式,该正则表达式不会匹配非函数语法,例如if()while()

PS:我使用以下工具来测试我的正则表达式

斯金纳

正则表达式帕尔

c regex syntax-highlighting

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

计算没有std函数或C99的atan2

我正在从3轴加速度计计算角度,但我的编译器没有atan或atan2功能.它有一个保留的内存插槽,但它调用了一个我在任何文件中都找不到的功能.

我的编译器是运行ARMCC编译器的KeilμVision4.编译有文件math.h,但函数是extern并且不存在:

  extern _ARMABI double atan2(double /*y*/, double /*x*/);
Run Code Online (Sandbox Code Playgroud)

是否有我可以包含的lib或函数,它具有arctan函数的实现?或者是否有另一种从加速度计计算角度的功能?我需要对角度进行完整的3轴校准.

编辑:我希望避免一个充满预先计算值的表格.

c embedded math arm atan2

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

给定目录名称,如何在 C 中找到它所在的文件系统?

例如,示例df命令输出是

Filesystem    MB blocks      Free %Used    Iused %Iused Mounted on
/dev/hd4         512.00    322.96   37%     4842     7% /
/dev/hd2        4096.00    717.96   83%    68173    29% /usr
/dev/hd9var     1024.00    670.96   35%     6385     4% /var
/dev/hd3        5120.00      0.39  100%      158    10% /tmp
Run Code Online (Sandbox Code Playgroud)

现在,如果我指定类似/tmp/dummy.txt我应该能够得到/dev/hd3或只是hd3.

编辑:感谢 torek 的回答。但是探查/proc会变得非常乏味。谁能建议我一些可以在内部执行相同操作的系统调用?

c linux filesystems directory mount

3
推荐指数
1
解决办法
2357
查看次数