我正在使用 Go 竞争检测(-race 参数),它检测到一些我认为不应该报告的竞争条件问题。我创建了这个示例代码来解释我的发现。请不要对此示例的目标发表评论,因为它除了解释问题之外没有其他目标。
这段代码:
var count int
func main() {
go update()
for {
fmt.Println(count)
time.Sleep(time.Second)
}
}
func update() {
for {
time.Sleep(time.Second)
count++
}
}
Run Code Online (Sandbox Code Playgroud)
报告有竞争条件。
虽然这段代码:
var count int
var mutex sync.RWMutex
func main() {
go update()
for {
mutex.RLock()
fmt.Println(count)
mutex.RUnlock()
time.Sleep(time.Second)
}
}
func update(){
for {
time.Sleep(time.Second)
mutex.Lock()
count++
mutex.Unlock()
}
}
Run Code Online (Sandbox Code Playgroud)
没有报告任何竞争条件问题。
我的问题是为什么?第一个代码中没有错误。main 函数正在读取另一个 go 例程正在更新的变量。这里没有潜在的隐藏错误。第二个代码互斥锁不提供任何不同的行为。
我哪里错了?
可能重复:C中的
"static const"vs"#define"
我的第一个想法是,这是隐含的,但是有没有理由为什么要使用const而不是#define?
如果你设置了一个全局变量,为什么你想要改变它,你也不想全局保护它?
我正在寻找类似于python global关键字的功能.我想从函数中更改main中声明的变量.
例如:
void f() {
x = 5;
}
int main() {
int x = 0;
f();
cout << x; // prints 5
}
Run Code Online (Sandbox Code Playgroud)
有解决方案吗
我有一个小问题,其中变量似乎没有被正确定义为变量.当我尝试print变量的值时WordLetters,它不会返回任何内容.当我尝试print变量的长度时,它返回0.
最初,我有一个NameError在方面WordLetters的变量,然后我外面定义的try:功能,现在它没有返回值.可能是它try:有自己的范围吗?如果是这样,我将如何将值附加到WordLetters列表中?
RandomWord = random.choice(Words)
try:
WordLetters = [RandomWord[0], RandomWord[1], RandomWord[2], RandomWord[3], RandomWord[4], RandomWord[5], RandomWord[6], RandomWord[7], RandomWord[8], RandomWord[9]]
except(IndexError):
pass
print("Word: " + "".join(WordLetters))
print("The word is " + str(len(WordLetters)) + " letters long.")
Run Code Online (Sandbox Code Playgroud) 如果我在C程序中使用未初始化的全局变量,会发生什么?是不确定的行为?
#include <stdio.h>
int i;
int main()
{
while(i < 5)
{
i++;
}
printf("%d\n", i);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 以下代码的输出为0.
int account=2;
int main()
{
static int account;
printf("%d",account);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么它选择静态变量而不是全局变量?因为我所理解的是全局变量和静态变量都存储在堆中而不是存储在函数堆栈中,对吧?那么它用什么方法来选择一个而不是另一个?
在C++语言中,声明变量全局是否有任何缺点?
void foo()
{
int a;
a=10;
}
int a;
void foo()
{
a=10;
}
Run Code Online (Sandbox Code Playgroud)
他们之间有什么不同?
例如,当我们声明任何全局变量时
int x;
Run Code Online (Sandbox Code Playgroud)
它相当于
extern int x;
Run Code Online (Sandbox Code Playgroud)
现在默认情况下,编译器将全局变量初始化为0,这意味着它们被分配了内存.但如果我只是写
extern int x;
Run Code Online (Sandbox Code Playgroud)
那么这只会声明变量,而不会分配任何内存.所以,我的查询是,如果我之前写externint x或者我不写它,在全局变量的情况下,编译器如何区别对待它们?在我简单写入的情况下int x,它分配内存并同时将extern置于之前int x,而在我写入的情况下extern int x,它只声明变量而没有分配内存.请说明编译器如何以两种方式运行.
我想要更少的方法.我想要一个通用的全局TestClass,我可以从中使用它在类中的任何值.
import java.util.*;
import java.io.*;
public class TestClass {
TestClass(String hello){
String hallo = hello;
String halloSecond = "Saluto!";
}
public static void main(String[] args) {
TestClass test = new TestClass("Tjena!");
System.out.println("I want "Tjena!": " + test.hallo);
TestClass testSecond = new TestClass("1");
System.out.println("I want Saluto!:" + test.halloSecond);
System.out.println("I want Saluto!:" + testSecond.halloSecond);
// How can I get glob.vars like the "Saluto!"?
}
}
Run Code Online (Sandbox Code Playgroud)
[澄清需要]我无法理解GLOB.VARS的不使用.请参阅下面的代码,在没有实例的情况下无法访问GLOB.VARS,因此出现错误.如果我保证没有恶意代码可以创建实例,使用GLOB.vars有什么问题吗?
$ javac TestClass.java
TestClass.java:19: non-static variable hallo cannot be referenced from a static context
System.out.println("It …Run Code Online (Sandbox Code Playgroud) 我有这个变量赋值:
var a = 2 + 2;
Run Code Online (Sandbox Code Playgroud)
值为a4.但我不希望它立即评估2 + 2表达式.如何使变量保持为,2 + 2而不是更改为4,直到程序到达我a要求评估的行?
2 + 2 我不是一个很好的例子,为什么我真的想要这样做,所以这里有一个非常简单的例子,我需要一个变量来评估,直到我想要它:
var a = (c > d); // and stay as an unevaluated condition
function b() {
var c = 5;
var d = 3;
// evaluate B here
return b;
}
Run Code Online (Sandbox Code Playgroud)
如果a在分配后立即解析,则会出现未定义的变量错误,因为c并且d未定义.我想延迟对条件的评估,直到我想要使用它(在所说的那一行evaluate B here).我怎么做?
javascript variables if-statement global-variables conditional-statements
global-variables ×10
c ×4
c++ ×3
variables ×3
scope ×2
extern ×1
go ×1
if-statement ×1
java ×1
javascript ×1
list ×1
mutex ×1
python ×1
python-3.x ×1
static ×1