uint32_t a = 10;
uint16_t b = 0;
if (a > b)
{
printf("a > b\n");
}
Run Code Online (Sandbox Code Playgroud)
我期望它b
会被提升int
,并且编译器会抱怨比较有符号和无符号。但编译器没有提出任何警告。
当我更改
if (a > b)
为if (a > (b * 10))
编译器时说
warning: comparison between signed and unsigned
Run Code Online (Sandbox Code Playgroud)
为什么会这样呢?
将其类型转换为 uint32_t 是否安全?
if (a > (uint32_t)(b * 10))
Run Code Online (Sandbox Code Playgroud) 什么时候为c中的变量分配内存?它是在声明或初始化期间发生的吗?这是根据范围或存储类别而有所不同吗?
例如:
int i; <<<<<<<< memory gets allocated here?
i=10; <<<<<<<< memory gets allocated here?
Run Code Online (Sandbox Code Playgroud)
我想,它会在声明中自行分配.如果我错了,请更正我.
以下是如何工作的?
char *str="string";
printf("str is %s\n",str);
Run Code Online (Sandbox Code Playgroud)
但是下面的一个给出了分段错误
int *i=3;
printf("int is %d\n",*i);
Run Code Online (Sandbox Code Playgroud) 我使用动态扩展的VHD选项在hyperv中创建了一个VM.现在我已经将该VHD导出到azure云并在azure中创建了一个VM.我的VM无法正常启动.是否建议使用动态扩展VHD在Azure中创建VM?
程序中的两个线程交替打印偶数和奇数,直到 100。我试过这个,它奏效了。有没有办法访问main内部共享数据的值,当值达到100时终止2个线程
#include<stdio.h>
#include<pthread.h>
pthread_t tid[2];
unsigned int shared_data = 0;
pthread_mutex_t mutex;
unsigned int rc;
//prototypes for callback functions
void* PrintEvenNos(void*);
void* PrintOddNos(void*);
void main(void)
{
pthread_create(&tid[0],0,&PrintEvenNos,0)
pthread_create(&tid[1],0,&PrintOddNos,0);
sleep(3);
pthread_join(tid[0],NULL);
pthread_join(tid[1],NULL);
}
void* PrintEvenNos(void *ptr)
{
pthread_mutex_lock(&mutex);
do
{
if(shared_data%2 == 0)
{
printf("Even:%d\n",shared_data);
shared_data++;
} else {
rc=pthread_mutex_unlock(&mutex);//if number is odd, do not print, release mutex
}
} while(shared_data <= 100);
}
void* PrintOddNos(void* ptr1)
{
rc = pthread_mutex_lock(&mutex);
do
{
if(shared_data%2 != 0)
{
printf("odd:%d\n",shared_data);
shared_data++;
} …
Run Code Online (Sandbox Code Playgroud) 我写了这个小程序来理解pthread_create和pthread_join,但我不明白为什么data
在thread_join之后变量的值会被改变.它在调用pthread函数后打印为0.
#include <pthread.h>
#include <stdio.h>
void* compute_prime (void* arg)
{
int n = *((int*) arg);
printf("Argument passed is %d\n",n);
return (void *)n;
}
int main ()
{
pthread_t thread;
int data = 5000;
int value=0;
pthread_create (&thread, NULL, &compute_prime, &data);
pthread_join (thread, (void*) &value);
printf("The number is %d and return value is %d.\n", data, value);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是
Argument passed is 5000
The number is 0 and return value is 5000.
Run Code Online (Sandbox Code Playgroud) libcurl 线程安全的要求之一是底层 SSL 库应该是线程安全的。
根据 GnuTLS 的文档,它的设计是线程安全的。
GnuTLS 库在设计上是线程安全的,这意味着只要单个线程访问单个对象,该库的对象(例如 TLS 会话)就可以安全地跨线程划分。这足以支持每个线程处理多个会话的服务器。对对象(例如持有结构的凭证)的只读访问也是线程安全的。
然而,有一些用例需要注意。
gnutls_session_t 对象也可以由两个线程共享,一个发送,另一个接收。但是,必须注意以下用例:
TLS 1.2 或更早版本中的重新握手过程必须仅在单个线程中处理,并且其他线程不得执行任何操作。
在此操作模式下不能安全地使用标志 GNUTLS_AUTO_REAUTH。
当线程接收或写入时,不得执行任何其他可能发送或接收数据的操作,例如密钥更新(参见 gnutls_session_key_update)。
会话的终止应该由处于活动状态的单个线程来处理,或者由发送者线程使用 gnutls_bye 和 GNUTLS_SHUT_WR 以及接收线程等待返回值零(或在某些不响应的服务器上超时)来处理。
在并行操作期间不应依赖函数 gnutls_transport_set_errno 和 gnutls_record_get_direction。
libcurl 是否能够处理上述用例?