我是C++的新手,我正在编写一个多线程的应用程序,不同的编写者会将对象推入堆栈,读者将它们从堆栈中拉出(或者至少将指针推到对象上).
是否有内置于C++中的结构可以在不添加锁定代码等的情况下处理此问题?如果没有,Boost库怎么样?
编辑:
你好.感谢最初的好答案.我想我认为这可能是内置的一个原因是我纯粹在x86空间思考并且认为指针的PUSH/POP应该是指令级别的原子动作.
我不确定我最初的预感是否正确,但我想在所有平台上都不一定如此.虽然如果在x86上运行,你是否会将原子PUSH和POP发送到堆栈中,如果是这样,这实际上是否使它无锁?
我目前正在嵌入Lua并将其用作一个美化的智能配置文件.但是,我认为我缺少一些东西,因为人们对Lua的使用赞不绝口.
例如,我可以通过显示这个示例轻松解释为什么你可以使用shell脚本而不是C(诚然,boost regexp是过度杀伤):
#include <dirent.h>
#include <stdio.h>
#include <boost/regex.hpp>
int main(int argc, char * argv[]) {
DIR *d;
struct dirent *dir;
boost::regex re(".*\\.cpp$");
if (argc==2) d = opendir(argv[1]); else d = opendir(".");
if (d) {
while ((dir = readdir(d)) != NULL) {
if (boost::regex_match(dir->d_name, re)) printf("%s\n", dir->d_name);
}
closedir(d);
}
return(0);
Run Code Online (Sandbox Code Playgroud)
并将其与:
for foo in *.cpp; do echo $foo; done;
Run Code Online (Sandbox Code Playgroud)
你能在Lua中给出任何可以让我"点击"的例子吗?
编辑:也许我的问题是我不知道Lua还不能流利地使用它,因为我发现编写C代码更容易.
EDIT2:
一个例子是C++和Lua中的玩具阶乘程序:
#include <iostream>
int fact (int n){
if (n==0) return 1; else
return (n*fact(n-1));
}
int main …Run Code Online (Sandbox Code Playgroud) 我正在使用原子(双)比较和交换指令实现无锁机制,例如cmpxchg16b
我目前正在汇编中编写它,然后将其链接进去.但是,我想知道是否有办法让编译器自动为我执行此操作?例如,带有'原子级'的环绕代码块,并让它弄清楚如何将代码实现为底层处理器体系结构中的原子指令(或者如果底层arch不支持它,则在编译时生成错误)?
PS我知道gcc有一些内置函数(至少对于CAS)
http://gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/Atomic-Builtins.html#Atomic-Builtins
这是练习中的代码:
#include <iostream>
using namespace std;
int main() {
int n = 13;
int* ip = new int(n + 3);
int* ip2 = ip;
cout << *ip << endl;
delete ip;
cout << *ip2 << endl;
cout << ip << tab << ip2 << endl;
}
Run Code Online (Sandbox Code Playgroud)
当删除分配给堆上的int的空间时,我认为取消引用指针会产生某种内存错误.相反,它返回0.
为什么是这样?
我注意到分析标记的一些错误:
class android.content.ActivityNotFoundException
Msg: android.app.Instrumentation.checkStartActivityResult:1408 (No Activity found to handle Intent { act=android.intent.action.VIEW dat=market://details?id=com.example.myprog })
Run Code Online (Sandbox Code Playgroud)
以下代码是为了打开Android Market.我是否认为此错误意味着未安装Android Market并且没有其他应用程序注册处理市场网址?
将汇编代码嵌入到C/C++程序中时,可以通过使用push指令保存寄存器(或指定编译器的clobber列表支持它)来避免破坏寄存器.
如果你包括汇编内联并希望避免推送和弹出破坏寄存器的开销,有没有办法让gcc为你选择寄存器(例如它知道它们中没有有用的信息).