小编vir*_*ino的帖子

随时可用的原子位设置和位重置函数?

我正在尝试在 Linux 下用 C 语言编写我的第一个多线程程序。我已经有一个程序在大缓冲区中设置和重置位,现在我只想让它更快 - 尽可能快,而不用在汇编程序中编写所有内容。

对于单线程程序,我为位操作定义了自己的宏(它们看起来又大又丑,但它们有效):

#define CELL_SIZE (64)

#define getBit(bitIdx, arr)   ( arr[ (bitIdx) / CELL_SIZE ] &   ( (1uL << (CELL_SIZE - 1)) >> (bitIdx) % CELL_SIZE))
#define resetBit(bitIdx, arr) ( arr[ (bitIdx) / CELL_SIZE ] &= ~( (1uL << (CELL_SIZE - 1)) >> (bitIdx) % CELL_SIZE))
Run Code Online (Sandbox Code Playgroud)

显然,这些操作绝非原子操作。

我做了一些研究,找到了几个答案。一些答案是关于如何在汇编程序中编写我自己的函数(我想避免)。

其他网站(这个这个)似乎准确地谈论了我所需要的 - 除了我不知道如何使用这些接口/宏。

我尝试了以下包含,但它们不起作用。

#include <linux/bitmap.h>
#include <asm/bitops.h>
Run Code Online (Sandbox Code Playgroud)

所以,基本上,我问如何使用已经实施的内容来完成我的工作?我应该包含哪些标头?

我不介意接口是否不在内核中,只要工作完成即可。

注意:每个线程都会一次(重新)设置一位——我不打算做任何 VOODOO 复杂的事情。


一个附带问题是:哪一个更快(总体而言,用伪代码编写):

reset_bit();
Run Code Online (Sandbox Code Playgroud)

或者

if ( bit_is_set() )
    reset_bit();
Run Code Online (Sandbox Code Playgroud)

通常情况下,reset_bit() 操作是不必要的,因为该位已经复位。关于设置设置位的同样问题。

c linux bit-manipulation x86-64 atomic

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

我在使用函数将字母分配给结构的char变量时遇到问题

我正在尝试给结构的char变量分配一个字母,但是我得到了垃圾输出,我不知道为什么这样一个简单的代码不起作用。我在互联网上找不到任何答案

我已经使用strcpy或只是使用,scanf但它不起作用。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct test
{
    int age;
    char name[15];

};
void reg(struct test a)
{
    //scanf("%s",&a.name);
    //strcpy(a.name,"Eldar");
}
int main()
{
    struct test el,*elp;
    elp=&el;
    reg(el);
    printf("%s",el.name);
}
Run Code Online (Sandbox Code Playgroud)

我收到一个奇怪的符号,但没有收到我的信

c parameter-passing pass-by-reference

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