我正在尝试在 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() 操作是不必要的,因为该位已经复位。关于设置设置位的同样问题。
我正在尝试给结构的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=⪙
reg(el);
printf("%s",el.name);
}
Run Code Online (Sandbox Code Playgroud)
我收到一个奇怪的符号,但没有收到我的信