微软笔试题 spin lock, 请赐教

kernelkoder 2015-03-30 03:19:16

Spin lock
Let’s assume the existence of the following function in C++:
int InterlockedExchange(LPINT target, INT value);
or in C#:
class Interlocked
{
public static int Exchange (ref int target, int value);
}
This function atomically exchanges a pair of 32-bit values by writing the new value at the position pointed by
target, and returning the prior value of the int value pointed to by target.
Using this function, we want to implement a SpinLock class that can be used as a thread synchronization
mechanism to synchronize the access when multiple threads concurrently execute code that writes to or
modifies the same resource.
The SpinLock class should have the following interface:
class SpinLock
{
public:
void Enter(); // acquire the spinlock
void Exit(); // release the spinlock
};
For example, assume there is a variable (sharedValue) accessed and modified by a function
(threadSafeFunction()). Since this function may be concurrently executed by several threads, we can use a
SpinLock to make the function thread- safe in the following way:
static int sharedValue; // shared resource
static SpinLock lock; // lock for the resource
void threadSafeFunction() // executed by multiple threads
{
lock.Enter();
//
// some code that accesses sharedValue
//
lock.Exit();
}
Implement the class SpinLock either in C++ or in C#.
...全文
355 3 打赏 收藏 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
panghuhu250 2015-04-28
  • 打赏
  • 举报
回复
引用 1 楼 my_live_123 的回复:
考的这么深入,本因为是要写底层,但是题目的意思,用开篇提到的已存在的函数实现

int lockval = 1;//初始化值
enter()
{
       while(lockval); //如果锁一直上锁状态,则死循环等待,如果某瞬间此锁已经开锁,则上锁
       Exchange(lockval, 1); //上锁
}

exit()
{
       Exchange(lockval, 0);//开锁
}
exchange(lockval, 1)后还要再检查返回值, 如果是1, 说明其它thread已经抢先了, 再接着等.
一根烂笔头 2015-04-28
  • 打赏
  • 举报
回复
引用 2 楼 panghuhu250 的回复:
[quote=引用 1 楼 my_live_123 的回复:] 考的这么深入,本因为是要写底层,但是题目的意思,用开篇提到的已存在的函数实现

int lockval = 1;//初始化值
enter()
{
       while(lockval); //如果锁一直上锁状态,则死循环等待,如果某瞬间此锁已经开锁,则上锁
       Exchange(lockval, 1); //上锁
}

exit()
{
       Exchange(lockval, 0);//开锁
}
exchange(lockval, 1)后还要再检查返回值, 如果是1, 说明其它thread已经抢先了, 再接着等.[/quote] 是有这么个点,多谢指教 patch:

- while(lockval);
- Exchange(lockval, 1); //上锁

+while(Exchange(lockval, 1) == 1); //如果一直上锁状态,那么返回值一直是1,==1在C语言中也可以省略,如果某瞬间开锁,那么它枷锁,返回0,循环结束
一根烂笔头 2015-04-25
  • 打赏
  • 举报
回复
考的这么深入,本因为是要写底层,但是题目的意思,用开篇提到的已存在的函数实现

int lockval = 1;//初始化值
enter()
{
       while(lockval); //如果锁一直上锁状态,则死循环等待,如果某瞬间此锁已经开锁,则上锁
       Exchange(lockval, 1); //上锁
}

exit()
{
       Exchange(lockval, 0);//开锁
}
内容概要:本文针对传统彩色数字图像加密算法存在的密钥空间有限、抗干扰能力弱等问题,提出一种结合混沌系统与DNA编码的复合型彩色图像加密解密方案。通过利用混沌系统对初始值和参数的极端敏感性生成高随机性伪随机序列,对图像RGB三通道像素进行置乱与扩散处理,并结合DNA编码的海量组合特性与并行运算优势,实现多层次的信息混淆与加密增强。重点对该方案进行了系统的抗噪声与抗裁剪性能分析,涵盖高斯噪声、椒盐噪声及不同面积、位置的裁剪攻击,实验结果表明该算法不仅具备大密钥空间和高安全性,而且在复杂传输环境下表现出优异的鲁棒性,能够有效恢复受损图像的核心信息,保障图像数据的安全性与可用性。; 适合人群:具备一定图像处理或信息安全基础知识的科研人员及研究生。; 使用场景及目标:①用于网络图像传输、私密图像存储等需要高安全性和强抗干扰能力的应用场景;②为图像加密技术提供一种兼具高安全性与强鲁棒性的设计方案参考,适用于多媒体信息安全、军事通信、医疗影像保护等领域。; 阅读建议:建议结合文中理论基础与实验分析部分,重点关注混沌系统与DNA编码的融合机制、加密流程设计及抗干扰测试方法,有条件者可复现实验以深入理解算法的性能表现与优化空间。
内容概要:本文以i.MX8MP EVK平台和L6.1.36 Linux版本为例,详细介绍Linux驱动开发中基于printk的多种调试技术。涵盖printk日志级别(0-7)的定义与调节方法,通过/proc/sys/kernel/printk控制日志输出等级;介绍动态调试(dynamic debug)和静态调试(debug)两种方式,实现运行时或编译时开启dev_dbg、pr_debug等调试信息输出;通过修改内核Makefile全局启用DEBUG宏,批量输出所有驱动的调试日志;此外还讲解了利用initcall_debug追踪内核初始化流程、启用DRM子系统专用调试参数、以及通过手动插入WARN_ON(1)或BUG_ON(1)触发栈回溯以分析函数调用路径等高级调试手段。; 适合人群:从事嵌入式Linux驱动开发,具备一定内核和驱动开发经验的工程师,尤其是使用NXP i.MX系列芯片的研发人员; 使用场景及目标:① 定位Linux内核启动异常或驱动加载失败问题;② 调试特定模块(如DRM、DSI桥接器)的运行流程;③ 分析函数调用栈和初始化顺序;④ 在无图形界面的嵌入式环境中通过串口日志进行问题排查; 阅读建议:建议结合实际开发板环境操作,重点掌握动态调试和initcall_debug等实用技巧,并注意大量调试日志可能影响系统启动性能,在调试完成后应及时关闭相关选项。

33,025

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧